二十二、两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
#include<stdio.h> int main() { char i,j,k; //设ac对手 for(i='X';i<='Z';i++) for(j='X';j<='Z';j++) for(k='X';k<='Z';k++) { if(i!=j&&j!=k&&k!=i) if(i!='Z'&&k!='X'&&k!='Z') printf("a------->%c b------->%c c------->%c ",i,j,k); } getch(); return 0; }
二十四、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
程序分析:第一项为2/1,第二项为3/2;之后设每项为a(n)/b(n)=(a(n-2)+a(n-1))/(b(n-2)+b(n-1)),典型的可用递归方法求得每一项的分母和分子;分别用两个函数求得分母和分子。
#include<stdio.h> int fenmu(int a) { if(a==0) return 1; if(a==1) return 2; else return fenmu(a-2)+fenmu(a-1); } int fenzi(int a) { if(a==0) return 2; if(a==1) return 3; else return fenzi(a-2)+fenzi(a-1); } int main() { float tsum=0.0,f1,f2; int i; for(i=0;i<20;i++) { f1=fenzi(i); f2=fenmu(i); tsum+=f1/f2; } printf("前20项总和为%f. ",tsum); getch(); return 0; }
二十五、求1+2!+3!+...+20!的和。
#include<stdio.h> int f(int n) { if(n==1) return 1; else return n*f(n-1); } int main() { int i; long sum=0; for(i=1;i<21;i++) { sum+=f(i); } printf("结果为%ld. ",sum); getch(); return 0; }
二十七、利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
#include<stdio.h> #include<string.h> void printchar(char *pc,int n) { char *px; px=pc-1; printf("%c",*pc); if(n!=0) printchar(px,n-1); } int main() { char c[1000]; int length; printf("输入一串字符: "); scanf("%s",c); length=strlen(c); printchar(&c[length-1],length); getch(); return 0; }
二十八、有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
#include<stdio.h> int age(int n) { if(n==1) return 10; else return age(n-1)+2; } int main() { printf("第五个人年纪是%d岁。 ",age(5)); getch(); return 0; }
二十九、给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
#include<stdio.h>
//求位数函数,递归方法,当然也可以用while语句
int fnum1(long m)
{
if(m/10==0)
return 1;
else
return fnum1(m/10)+1;
}
//正序输出每一个数字,以逗号分隔;
void fnum2(long m)
{
int i;
int num=1;
int n=fnum1(m);
for(i=0;i<n-1;i++)
num=num*10;
for(i=0;i<n;i++)
{
printf("%d,",m/num);
m=m%num;
num=num/10;
}
}
void fnum2_digui(long m)
{
if(fnum1(m)==1)
printf("%ld",m);
else
{
fnum2_digui(m/10);
printf("%ld",m%10);
}
}
//逆序输出每一个数字
void fnum3(long m)
{
int i=0;
do
{
printf("%ld,",m%10);
m=m/10;
i++;
}while(m!=0);
}
int main()
{
long x;
printf("请输入一个不超过五位数的整数。
");
scanf("%ld",&x);
printf("你输入的是一个%d位数。
",fnum1(x));
printf("正序输出为:
");
fnum2(x);
printf("
逆序输出为:
");
fnum3(x);
getch();
return 0;
}
三十七、对10个数进行排序。
#include<stdio.h> void paixu(unsigned int a[],int n) { int i,j,t; for(i=0;i<n;i++) for(j=0;j<(n-i-1);j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } for(i=0;i<n;i++) printf("%d ",a[i]); } int main() { unsigned int a[10]; int i; void paixu(unsigned int a[],int n); printf("请输入十个正整数: "); for(i=0;i<10;i++) scanf("%d",&a[i]); paixu(a,10); getch(); return 0; }
三十八、求一个3*3矩阵对角线元素之和。
#include<stdio.h> int qiuhe(int (*a)[3],int n) //参数1为一个指向含有m个整型元素的一维数组指针,m为列,n为行 { int i,sum=0; for(i=0;i<n;i++) sum+=a[i][i]; return sum; } int main() { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; printf("对角线数字之和为%d. ",qiuhe(a,3)); getch(); return 0; }
四十、将一个数组逆序输出。
#include<stdio.h> void print_array(int a[],int n) { int i; for(i=0;i<n;i++) { printf("%d ",*a); a++; } printf(" "); } int main() { int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[10],i,*p; void print_array(int a[],int n); for(i=0;i<10;i++) b[i]=a[9-i]; p=b; print_array(a,10); print_array(b,10); print_array(p,10); getch(); return 0; }