Contest 8
拆分实数的整数与小数部分
Description
本题要求实现一个拆分实数的整数与小数部分的简单函数。
函数接口定义:
void splitfloat( float x, int *intpart, float *fracpart);
其中x是被拆分的实数(0≤x<10000),*intpart和*fracpart分别是将实数x拆分出来的整数部分与小数部分。
请实现函数接口,并在主函数中调用它。
Input
一行一个浮点数x。
Output
一行两个数,分别表示x的整数部分和小数部分。(小数保留三位小数)
Sample Input 1
2.718
Sample Output 1
2 0.718
#include <stdio.h>
void splitfloat(float x,int * intpart ,float * fracpart);
int main()
{
float x;
scanf("%f",&x);
int intpart;
float fracpart;
splitfloat(x, & intpart, & fracpart);
printf("%d ",intpart);
printf("%.3f",fracpart);
return 0;
}
void splitfloat(float x,int * intpart ,float * fracpart)
{
int a=(int)x;
* intpart = a;
float b=x-a;
* fracpart = b;
}
在数组中查找指定元素
Description
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到
则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。
Input
第一行一个整数n。
接下来一行n个整数代表数组a。
最后一行一个整数表示要查找的元素x。
Output
输出下标或-1。
Sample Input 1
5
1 2 2 5 4
2
Sample Output 1
1
Sample Input 2
5
1 2 2 5 4
0
Sample Output 2
-1
//国庆之后很快就是测验了,考到数组,不考指针
//打印地址 %p
#include<stdio.h>
#include<stdlib.h>
int search(int list[],int n,int x){
for(int i=0;i<n;i++){
if(*(list+i)==x)return i;
}
return -1;
}
int main(){
int n,tmp,x;
scanf("%d",&n);
int* arr=(int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++){
scanf("%d",&tmp);
*(arr+i)=tmp;
}
scanf("%d",&x);
printf("%d",search(arr,n,x));
return 0;
}
数组循环右移
Description
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,
即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。
函数接口定义:
int ArrayShift( int a[], int n, int m );
其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。
Input
第一行两个整数n和m。
接下来一行n个整数,代表数组a。
Output
一行n个整数,代表循环右移后的数组a。
Sample Input 1
6 2
1 2 3 4 5 6
Sample Output 1
5 6 1 2 3 4
#include <stdio.h>
int ArrayShift( int *a, int n, int m );
int main()
{
int i,m,n;
scanf("%d%d",&n,&m);
int a[n];
for ( i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
if (m>n)
{
m=m%n;
}
ArrayShift(a,n,m);
return 0;
}
int ArrayShift(int * a,int n,int m)
{
int b[300],i;
for ( i = 0; i < n; i++)
{
b[i]=a[i];/*把数组a中的元素存入中间数组b*/
}
/*对数组a重新赋值*/
for ( i = 0; i < m; i++)
{
a[i]=b[n-m+i];/*数组a的前m个数是数组a原来最后面的m个数,注意n-m+i的表达*/
}
for ( i = m; i < n; i++)
{
a[i]=b[i-m];/*数组a后面的n-m个数是原来的前n-m个数*/
}
for ( i = 0; i < n; i++)
{
printf("%d ",a[i]);
}
return 0;
}
报数
Description
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;
下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
本题要求编写函数,给出每个人的退出顺序编号。
函数接口定义:
void CountOff( int n, int m, int out[] );
其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff将每个人的退出顺序编号存在数组out[]中。
因为C语言数组下标是从0开始的,所以第i个位置上的人是第out[i-1]个退出的。
Input
一行两个整数n和m。
Output
一行n个整数,代表依次退出的人的编号。
Sample Input 1
11 3
Sample Output 1
4 10 1 7 5 2 11 9 3 6 8
#include <stdio.h>
void countoff(int n,int m,int out[]){
m=m%n;
int nxt[n];
for(int i=0;i<n;i++)nxt[i]=i+1;
int count=0,i=0,cnt=0;
while(count<n){
if(nxt[i]!=0)cnt++;
if(cnt==m){
cnt=0;count++;
out[i]=count;
nxt[i]=0;
}
i++;
if(i==n)i=0;
}
}
int main(){
int n,m,out[6666];
scanf("%d%d",&n,&m);
countoff(n,m,out);
for(int i=0;i<n;i++)printf("%d ",out[i]);
return 0;
}
使用函数实现字符串部分复制
Description
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。
Input
第一行一个整数m。
第二行一个字符串t。
Output
一个字符串s。
Sample Input 1
7
happy new year
Sample Output 1
new year
#include<stdio.h>
#include<stdlib.h>
void strmcpy( char *t, int m, char *s );
int main()
{
int m,tmp=0,lenn;char c;
scanf("%d",&m);
char t[100000];
while((c=getchar())!=EOF)t[tmp++]=c;
lenn=tmp;
char *s=(char *)malloc(lenn* sizeof(char));
strmcpy( t, m, s );
for (int i = 0; s[i]!='\0'; i++)printf("%c",s[i]);
return 0;
}
void strmcpy( char *t, int m, char *s ){
int i,k=0;
for (i = m;i< t[i]!='\0'; i++)
{
s[k]=t[i];
k++;
}
s[k]='\0';
}
删除字符
Description
本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
void delchar( char *str, char c );
其中char *str是传入的字符串,c是待删除的字符。函数delchar的功能是将字符串str中出现的所有c字符删除。
Input
第一行一个字符c。
第二行一个字符串str。
Output
一行一个字符串,表示字符串str删除字符c后的字符串。
Sample Input 1
a
happy new year
Sample Output 1
hppy new yer
#include <stdio.h>
void delchar( char *str, char c );
int main()
{
char str[100000];
char c;
scanf("%c",&c);
int i=0;
getchar();
while (scanf("%c",&str[i])!=EOF&&str[i]!='\n')
i++;
str[i]=-1;
delchar( str, c );
return 0;
}
void delchar( char *str, char c )
{
int i=0;
for ( i = 0; str[i]!=-1; i++)
{
if (str[i]==c)
{
str[i]=0;
}
}
for ( i = 0; str[i]!=-1; i++)
{
if (str[i]!=0)
{
printf("%c",str[i]);
}
}
}
字符串排序
Description
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
Input
输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。
Output
按照以下格式输出排序后的结果:
After sorted:
每行一个字符串
Sample Input 1
red yellow blue green white
Sample Output 1
After sorted:
blue
green
red
white
yellow
//国庆之后很快就是测验了,考到数组,不考指针
//打印地址 %p
#include<stdio.h>
#include<string.h>
#define N 80
int main(){
char str[5][N],tmp[N];
int i,j,pos;
for(i=0;i<5;i++){
scanf("%s",&str[i]);
}
for(i=0;i<5;i++){
for(j=1;j<5;j++){
if(strcmp(str[j],str[j-1])<0){//strcmp逐字比较
strcpy(tmp,str[j-1]);//strcpy复制字符串
strcpy(str[j-1],str[j]);
strcpy(str[j],tmp);
}
}
}
printf("After sorted:\n");
for(i=0;i<5;i++)
printf("%s\n",str[i]);
return 0;
}
判断回文字符串
Description
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
函数接口定义:
bool palindrome( char *s );
函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false。
Input
一行一个字符串。
Output
输出一行。若是回文,输出‘Yes’,否则输出‘No’。(不包括引号)
Sample Input 1
thisistrueurtsisiht
Sample Output 1
Yes
//国庆之后很快就是测验了,考到数组,不考指针
//打印地址 %p
#include<stdio.h>
#include<string.h>
int palindrome( char *s ){
int lenn=strlen(s);
for(int i=0;2*i<lenn;i++){
if(*(s+i)!=*(s+lenn-1-i))return 0;
}
return 1;
}
int main(){
char str[666];
gets(str);
if(palindrome(str))puts("Yes");
else puts("No");
return 0;
}
分类统计各类字符个数
Description
本题要求实现一个函数,统计给定字符串中的大写字母、小写字母、空格、数字以及其它字符各有多少。
函数接口定义:
void StringCount( char *s );
其中char *s是用户传入的字符串。函数StringCount须在一行内按照
大写字母个数 小写字母个数 空格个数 数字个数 其它字符个数 (注: 换行符也算字符)的格式输出。
Input
若干行字符串
Output
一行5个整数。
Sample Input 1
aZ&*?
093 Az
Sample Output 1
2 2 1 3 4
//国庆之后很快就是测验了,考到数组,不考指针
//打印地址 %p
#include<stdio.h>
void stringcount(char *s){
int ans1=0,ans2=0,ans3=0,ans4=0,ans5=0,tot=0,tmp;
while(1){
if(*(s+tot)==127)break;
if(*(s+tot)>='A'&&*(s+tot)<='Z')ans1++;
else if(*(s+tot)>='a'&&*(s+tot)<='z')ans2++;
else if(*(s+tot)==' ')ans3++;
else if(*(s+tot)>='0'&&*(s+tot)<='9')ans4++;
else ans5++;
tot++;
}
printf("%d %d %d %d %d",ans1,ans2,ans3,ans4,ans5);
}
int main(){
char c,st[66666];
int tot=0;
while(1){
c=getchar();
if(c==EOF){st[tot]=127;break;}
st[tot++]=c;
}
stringcount(&st);
return 0;
}
输出学生成绩
Description
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。
注意:使用动态内存分配来实现!!!
Input
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
Output
按照以下格式输出:
average =平均成绩
max =最高成绩
min =最低成绩
结果均保留两位小数。
Sample Input 1
3
85 90 95
Sample Output 1
average = 90.00
max = 95.00
min = 85.00
//国庆之后很快就是测验了,考到数组,不考指针
//打印地址 %p
#include<stdio.h>
#include<stdlib.h>
int n;
int main(){
scanf("%d",&n);
float* arr=(float*)malloc(n*sizeof(float));
float tmp,average=0.0f;
float maxx=0.0f,minn=999999.0f;
for(int i=0;i<n;i++){
scanf("%f",&tmp);
*(arr+i)=tmp;
}
for(int i=0;i<n;i++){
if(*(arr+i) > maxx )maxx=*(arr+i);
if(*(arr+i) < minn )minn=*(arr+i);
average+=(*(arr+i));
}
printf("average = %.2f\nmax = %.2f\nmin = %.2f",average/n,maxx,minn);
free(arr);
return 0;
}