初级:
一.请编写函数long fun(long int x),功能是:将长整型数x中每一位上为奇数的数依次取出,并逆序和顺序分别构成一个新数返回。
例如:程序运行时输入123456789,输出:b=97531 和13579。
#include <stdio.h> //逆序输出 long fun(long int x) { int a; long b=0; while (x!=0) { a=x%10; if (a%2!=0) { b=b*10+a; } x=x/10; } return (b); } //顺序输出 long fun2(long int x) { int a,m=1; long b=0; while (x!=0) { a=x%10; if (a%2!=0) { b=a*m+b; m*=10; } x=x/10; } return (b); } int main() { long int x; printf("Please input a long int num:"); scanf("%ld",&x); long b=fun2(x); printf("b=%ld\n",b); }
二 编写函数void fun(int *x,int n),它的功能是:求出数组x中的最小数和次最小数,并把最小数和a[0]中的数对调、次最小数和a[1]中的数对调,其余的数保持不变。
如程序运行时若输入:2 4 6 11 3 9 7 0 5 8,则输出:0 2 6 11 3 9 7 4 5 8。
#include <stdio.h> void fun(int *x,int n) { int i,j,k=0; for (i=0;i<2;i++) { int temp=x[i]; for (j=i;j<n;j++) { if (x[i]>x[j]) { x[i]=x[j]; k=j; } } x[i]=x[k]; x[k]=temp; } } int main() { int n; int x[50]; printf("input size N :"); scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%d",&x[i]); } fun(x,n); for (i=0;i<n;i++) { printf("%d ",x[i]); } }
三. 编写函数long fun(int high,int n),功能是:计算并返回high以内(不包含high)最大的n个素数之和。若不足n个,则到最小素数2为止。
例如:若high=100,n=10,则函数的返回值为:732;若high=11,n=10,则函数返回:17。
分析:素数就是只有1这个约数。high以内的数,肯定最大的因数是q=sqrt(high);,判断从2-q没有一个数能整除的即是素数
long fun(int high,int n) { int i,j,count=0,sum=0; int q=sqrt(high); for (i=high-1;i>=2;i--) { for (j=q;j>1;j--) { if (i%j==0 && i>j)//注意,&&后面的条件,负责会把素因子漏掉 break; } if (j<=1) { sum+=i; count++; } if (count==n) break; } return sum; } int main() { int high,n; scanf("%d %d",&high,&n); printf("%d\n",fun(high,n)); }
四 函数void fun(int x,char * p)实现十进制整数x到二进制的转换。转换后的二进制数以字符串的方式放置于p所指向的数组中。
如输入13,输出1101,输入-13,输出-1101。
分析:能被2整除二进制位为0,否则为1,中间借助额外数组保存临时数据。
void fun(int x,char *p) { int i,k,j=0; int m=x; char s[50]; while (x!=0) { if (x%2==0) { s[j]='0'; } else s[j]='1'; j++; x=x/2; } for (i=j-1, k=0;i>=0;i--,k++) { if (m<0) { p[0]='-'; p[k+1]=s[i]; } else { p[k]=s[i]; } } if (i==-1) { if (m<0) { p[k+1]='\0'; } else p[k]='\0'; } } int main() { int x; char p[50]; scanf("%d",&x); fun(x,p); printf("%s\n",p); }
五 .编写函数int fun(char (*ss)[N],int m,char *s),功能是:形参ss指向一个m行N列的二维字符数组,每行存放一个字符串。求出最大的字符串,复制到s所指的字符数组中,然后返回此最大字符串的长度。
考察数组指针,以及字符串比较和拷贝
#include <stdio.h> #include <string.h> #define N 50 int fun(char (*ss)[N],int m,char *s) { int i; //char p[N]; strcpy(s,*ss); for (i=1;i<m;i++) { if (strcmp(s,*(ss+i))<0) { strcpy(s,*(ss+i)); } } int len=strlen(s); return len; }
六 给定程序中,函数void fun(char *s)的功能是:把形参s所指字符串中下标为偶数的字符右移到下一个偶数位置,最右边被移出字符串的字符绕回放到第一个偶数位置,下标为奇数的字符不动(注:字符串的长度大于等于2)。
例:若输入:abcd123,输出:3badc21
很巧妙的方法 ,每次都和第一位交换
循环次数 一 a b c d 1 2 3
二 c b a d 1 2 3
三 1 b a d c 2 3
四 3 b a d c 2 1
void fun(char *s) { int i; char c; for (i=1;s[i]!='\0';i++) { if (i%2==0) { c=s[0]; s[0]=s[i]; s[i]=c; } } }
七 .函数void fun(char s[])的功能是:将s所指字符串中ASCII值为奇数的字符删除。
例如,若s所指字符串中的内容为:“ABCDEFG12345”,其中字符A的ASCII码值为奇数、?、字符1的ASCII码值也为奇数、?都应当删除,其它依此类推。最后s中内容是:“BDF24”。
方法一:借助临时数组
void fun1(char *s) { int i,j; char p[50]; for (j=0,i=0;s[i]!='\0';i++) { if ((int)s[i]%2==0) { p[j]=s[i]; j++; } } p[j]='\0'; strcpy(s,p); }
方法二:只用一个数组,每次把要删除的数后面的数往前移一位
void fun2(char *s) { int i,j; for (i=0;s[i]!='\0';i++) { if (s[i]%2!=0) { for (j=i;s[j]!='\0';j++) { s[j]=s[j+1]; } i--; } } }
八 请编写一个函数int fun(long int x),它的功能是:判断整数x是否是同构数。若是同构数,函数返回1;否则返回0。所谓“同构数”是指这样的数,它出现在它的平方数的右边。
例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数,输出"Yes"。要求x的值不大于10000。
bool fun(long int x) { int i; int m=x*x; for (i=10;m%i!=0;i*=10) { if (m%i==x) return true; } return false; }
八 编写函数void fun(char *str),将参数字符串中各单词首字母变大写,其余字母变小写。输入输出在main中实现。
如输入"you HAVE 10 books,don't you? " 输出"You Have 10 Books,Don't You?"。单词以空格、逗号、句号分隔。
void fun(char *str) { int i,j; //先把首个单词首字母小写变大写 if (str[0]>='a'&&str[0]<='z') str[0]-=32; //这段比较难理解 for (i=0;str[i]!='\0';i++) { if (str[i]==' '||str[i]==','||str[i]=='.') { if (str[i+1]>='a'&&str[i+1]<='z') { str[i+1]-=32; } } else if (str[i+1]>='A'&&str[i+1]<='Z') { str[i+1]+=32; } } }
九 n个整数,前面各数循环顺序后移m个位置,最后m个数变成最前面m个数。写函数void fun(int *p,int n,int m),实现上述功能。在main()中输入与输出。
如下面程序输出 7 8 9 10 1 2 3 4 5 6 。注意,m可能大于n。
//m是循环个数,n是数组长度 void fun(int *p,int n,int m) { int i,j; m=m%n; for (j=0;j<m;j++) { int a=p[n-1]; for (i=n-1;i>0;i--) { p[i]=p[i-1]; } p[0]=a; } }
十 编写函数void fun(char *s1,char *s2),实现字符串s1与s2的交叉连接,连接后得到的新字符串放在s1中。
如输入abc12345,输出a1b2c345,若输入abcde123,则输出a1b2c3de。
方法一:借助临时数组
void fun(char *s1,char *s2) { int i,j; int m=strlen(s1); int n=strlen(s2); char p [100]; if (m>n) { for (j=0,i=0;i<n;i++,j++) { p[j]=s1[i]; p[j+1]=s2[i]; j++; } for (int k=m-n+1;k<m;k++,j++) { p[j]=s1[k]; } p[j]='\0'; } else if (m<n) { for (j=0,i=0;i<m;i++,j++) { p[j]=s1[i]; p[j+1]=s2[i]; j++; } for (int k=n-m+1;k<n;k++,j++) { p[j]=s2[k]; } p[j]='\0'; } else { for (j=0,i=0;i<m;i++,j++) { p[j]=s1[i]; p[j+1]=s2[i]; j++; } p[j]='\0'; } strcpy(s1,p); }
方法二:不需要多余数组,方法不错
void fun2(char *s1,char *s2) { int i,j,k; //int len=strlen(s1); for (j=0,i=1;s2[j]!='\0';) { for (k=strlen(s1);k>=i;k--) { s1[k+1]=s1[k];//每次把'\0'也往后移动 } s1[i]=s2[j]; i++; j++; if (s1[i]) i++; } }
十一 传说可以根据两个人的生日来计算其缘分.方法:将两个人的生日各位相加,将得到的数再一次各位相加,直到其值为一个一位数,此数即代表两个人的缘分.
例如,两个生日为:19820523,19841111,则各位相加:1+9+8+2+5+2+3+1+9+8+4+1+1+1+1得:56;再5+6得11;再 1+1得2,即为两人的缘分.编写计算缘分程序,两个生日由键盘输入
分析:注意19820523,19841111各位数相加与x+y后各位相加的效果一样
int fun(long x,long y) { int m,sum=0; for (m=x+y;m>0||sum>=10;) { sum+=m%10; m/=10; if (m==0&&sum>=10) { m=sum; sum=0; } } return sum; }
十二 编写函数float fun(int m),功能是:根据正整型形参m,计算如下公式的值: y=1-1/2+1/3-1/4+1/5...+(-)1/m ,该值作为函数返回值.
float fun(int m) { int i; float sum=0.0; for (i=1;i<=m;i++) { if (i%2!=0) { sum+=1.0/i; } else sum-=1.0/i; } return sum; }
进阶题:
一 m个人围成一圈,1,2,3循环报数,报到3的人退出,并将退出的序号依次存到数组p中,包括最后一个人的序号。到最后只余1人,输出最后留下的是第几号(最初的序号,以1起始)及。
若m=6,则输出n=1 3 6 4 2 5 1;若m=10,则输出n=4 3 6 9 2 7 8 5 10 4;若m=100,则输出n=91??。函数int fun(int n ,int *p)实现上述功能,返回n个人中最后余的1人的起始序号,并将退出的序号顺序写入p指向的数组中。
#include <stdlib.h> //20 n,人个数,p数组保存退出序号 int fun(int n,int *p) { int i,j=0,k=0,m=0; int *a=(int *)malloc(n*sizeof(int)); //把原始数据存入数组a for (i=0;i<n;i++) { a[i]=i+1; } i=0; //退出一个人,a数组中相应位置变为0 while(m<n) { if (a[j]!=0) k++; if (k==3)//也不能是k%3==0,否则k=0也满足 { p[i]=a[j]; a[j]=0; i++; m++; k=0; //k从0计数到3,再清0.不能累加,否则当a[j]=0时,k虽然不自加,但仍然是3倍数时,会输出a[j]=0 } j++; if (j==n)//a数组循环一遍从0再开始 j=0; } free(a); return p[n-1]; } int main() { int n=20; int p[200]; int num=fun(n,p); printf("%d\n",num); for (int i=0;i<n;i++) { printf("%d,",p[i]); } }