目录
第 21 例
第 22 例
第 23 例
第 24 例
第 25 例
第 26 例
第 27 例
第 28 例
第 29 例
第 30 例
第 21 例
程序源码:
/*
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少桃子。程序分析:采取逆向思维的方法,从后往前推断。1) 设x1为前一天桃子数,设x2为第二天桃子数, 则:x2=x1/2-1, x1=(x2+1)*2x3=x2/2-1, x2=(x3+1)*2以此类推: x前=(x后+1)*22) 从第10天可以类推到第1天,是一个循环过程。
*/#include <stdio.h>
#include <stdlib.h>int main()
{int day, x1 = 0, x2;day=9;x2=1;while(day>0){x1=(x2+1)*2; // 第一天的桃子数是第2天桃子数加1后的2倍x2=x1;day--;}printf("第一天共摘了 %d 个桃子。\n",x1);printf ("\n");return 0;
}
程序运行结果:
第 22 例
程序源码:
/*
题目:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单,有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三对赛手的名单。程序分析:详见下面的代码。
*/#include <stdio.h>
#include <stdlib.h>int main()
{char i,j,k;for(i='x';i<='z';i++){for(j='x';j<='z';j++){if(i!=j){for(k='x';k<='z';k++){if(i!=k&&j!=k){if(i!='x'&&k!='x'&&k!='z'){printf("三对赛手的名单为:\na--%c\nb--%c\nc--%c\n",i,j,k);}}}}}}return 0;
}
程序运行结果:
第 23 例
程序源码:
/*
题目:打印出如下图案(菱形)。*********
****************程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
*/#include <stdio.h>int main()
{int i,j,k;for(i=0;i<=3;i++){for(j=0;j<=2-i;j++){printf(" ");}for(k=0;k<=2*i;k++){printf("*");}printf("\n");}for(i=0;i<=2;i++){for(j=0;j<=i;j++){printf(" ");}for(k=0;k<=4-2*i;k++){printf("*");}printf("\n");}return 0;
}
程序运行结果:
第 24 例
程序源码:
/*
题目:有一个分数数列如下,2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。程序分析:重点是抓住分子与分母的变化规律。
*/#include <stdio.h>int main()
{int i,t;float sum=0;float a=2,b=1;for(i=1;i<=20;i++){sum=sum+a/b;t=a;a=a+b;b=t;}printf("这个数列的前20项之和等于 %9.6f\n",sum);return 0;
}
程序运行结果:
第 25 例
程序源码:
/*
题目:求1!+2!+3!+...+20!的值。程序分析:此程序只是把累加变成了累乘。
*/#include <stdio.h>int main()
{int i;long double sum,mix;sum=0,mix=1;for(i=1;i<=20;i++){mix=mix*i;sum=sum+mix;} printf("1!+2!+3!+...+20! = %lf\n",sum);return 0;
}
程序运行结果:
第 26 例
程序源码:
/*
题目:利用递归方法求5!。程序分析:递归公式:f(n)=f(n-1)*n
*/#include <stdio.h>int main()
{int i;int fact(int);for(i=0;i<6;i++){printf("%d! = %d\n",i,fact(i));}return 0;
}int fact(int j)
{int sum;if(j==0){sum=1;}else{sum=j*fact(j-1);}return sum;
}
程序运行结果:
第 27 例
程序源码:
/*
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。程序分析:详见下面的代码。
*/#include <stdio.h>int main()
{int i=5;void palin(int n);printf("请输入5个字符:");palin(i);printf("\n");return 0;
}void palin(int n)
{char next;if(n<=1){next=getchar();printf("相反顺序输出结果是:");putchar(next);}else{next=getchar();palin(n-1);putchar(next);}
}
程序运行结果:
第 28 例
程序源码:
/*
题目:编写一个程序计算两个矩阵的叉乘,并输出结果。程序分析:详见下面的代码。
*/#include <stdio.h>#define N 3
#define M 4int main ()
{int a[N][M],b[M][N]; //定义二维整型数组a和b。int i,j,k,s;printf ("请输入二维整型数组a的12个元素:\n");//利用双重循环通过键盘给二维整型数组a赋值。for (i=0;i<N;i++){for (j=0;j<M;j++){printf ("a[%d][%d]=",i,j);scanf ("%d",&a[i][j]);}}printf ("\n请输入二维整型数组b的12个元素:\n");//利用双重循环通过键盘给二维整型数组a赋值。for (i=0;i<M;i++){for (j=0;j<N;j++){printf ("b[%d][%d]=",i,j);scanf ("%d",&b[i][j]);}}//输出二维整型数组a。printf ("\n二维整型数组a:\n");for (i=0;i<N;i++){for (j=0;j<M;j++){printf ("%-5d",a[i][j]);}printf ("\n");}//输出二维整型数组b。printf ("\n二维整型数组b:\n");for (i=0;i<M;i++){for (j=0;j<N;j++){printf ("%-5d",b[i][j]);}printf ("\n");}//计算 s = a×b 的值,并输出 s 的值。printf ("\n“二维整型数组a×二维整型数组b”的结果是:\n");for (i=0;i<N;i++){for (j=0;j<N;j++){for (k=s=0;k<M;k++){s+=a[i][k]*b[k][j];}printf ("%-10d",s);}printf ("\n");}printf ("\n");return 0;
}
程序运行结果:
第 29 例
程序源码:
/*
题目:给一个不多于5位的正整数,求它是几位数,并逆序打印出各位数字。程序分析:分解出每一位数,详见下面的代码。
*/#include <stdio.h>int main( )
{long a,b,c,d,e,x;printf("请输入一个不多于 5 位的正整数:");scanf("%ld",&x);a=x/10000; //分解出万位b=x%10000/1000; //分解出千位c=x%1000/100; //分解出百位d=x%100/10; //分解出十位e=x%10; //分解出个位if (a!=0){printf("该数字为 5 位数,逆序输出为:%ld%ld%ld%ld%ld\n",e,d,c,b,a);}else if(b!=0){printf("该数字为 4 位数,逆序输出为:%ld%ld%ld%ld\n",e,d,c,b);} else if(c!=0){printf("该数字为 3 位数,逆序输出为:%ld%ld%ld\n",e,d,c);} else if(d!=0){printf("该数字为 2 位数,逆序输出为:%ld%ld\n",e,d);} else if(e!=0){printf("该数字为 1 位数,逆序输出为:%ld\n",e);}return 0;
}
程序运行结果:
第 30 例
程序源码:
/*
题目:输入一个5位数,判断它是不是回文数。个位与万位相同,十位与千位相同的5位数是回文数,比如12321是回文数。程序分析:分解出每一位数,详见下面的代码。
*/#include <stdio.h>int main( )
{long ge,shi,qian,wan,x;printf("请输入一个 5 位数:");scanf("%ld",&x);wan=x/10000; //分解出万位qian=x%10000/1000; //分解出千位shi=x%100/10; //分解出十位ge=x%10; //分解出个位if (ge==wan&&shi==qian){ //个位等于万位并且十位等于千位printf("%d 是回文数!\n",x);}else{printf("%d 不是回文数!\n",x);}return 0;
}
程序运行结果: