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