实验三 循环结构程序设计(参考答案)
1、设计程序sy3-1.c ,要求打印小学九九乘法表。 算法分析:
根据九九乘法表可知,该表共有9行,第i行有i个表达式,而且表达式中的操作数和行、列数相关,因此可以用嵌套的双重循环来实现,外循环控制行数(循环变量从1到9),内循环控制每行的表达式个数(循环变量从1变到i)。 参考答案:
# include
int i,j;
for(i=1;i<=9;i++) {
for(j=1;j<=i;j++)
printf(\ printf(\ } }
运行结果:
2、设计程序sy3-2.c ,要求编程计算x,其中x和n均由键盘输入2。 算法分析:
要计算x的n次方,即是n次x相乘,其中x可以是整型或实型,而n必须是整型;另外要考虑结果的类型,若x和n比较大,一般的int型容易产生溢出。 参考答案:
# include
float x,p=1; /*累乘器要赋初值1*/ printf(\
scanf(\ /*以逗号分隔输入的已知数据x和n的值*/ for(i=1;i<=n;i++)
p=p*x;
printf(\}
n
运行结果:
3、设计程序sy3-3.c,已知祖父年龄70岁,长孙20岁,次孙15岁,幼孙5岁,问要过多少年,三个孙子的年龄之和同祖父的年龄相等,试用单重循环结构编程实现。 算法分析:
这个程序可以用穷举法来实现,1年、2年、3年……,每加一年都判断三个孙子的年龄之和是否同祖父的年龄相等,若相等则不加了,这个时候所加的年数为我们需要的结果。 参考答案:
# include
int i,a,b,c,d;
a=20; b=15; c=5; d=70; i=1;
while(a+i+b+i+c+i!=d+i)
i++;
printf(\} 运行结果:
4、设计程序sy3-4.c ,有一数列:2/1,3/2,5/3,8/5,…求出这个数列的前10项之和。 算法分析:
这是一个序列累加的算法,第一项的值是2/1,之后每一项的规律是:分母为前一项的分子,分子为前一项分子分母之和;另外注意在除运算中若分子分母都为整数则结果也为整数,显然在这道题中分子分母的类型应为实型。 参考答案:
# include
int i;
float s=0,a=2,b=1,c,t; for(i=1;i<=10;i++) { t=a/b; s=s+t; c=a; a=a+b; b=c;
/*计算确定分子分母后当前项的值*/ /*将当前项t的值累加到求和变量s当中*/ /*将前一项的分子暂存于c变量中*/
/*修改下一项的分子为前一项分子分母之和*/ /*修改下一项的分母为前一项的分子*/
}
printf(\
} 运行结果:
5、设计程序sy3-5.c ,一球从200米高度自由落下,每次落地后反跳回原高度的四分之一,再落下。编程求它第10次落地时共经过的路程及第10次落地后反弹的高度。 算法分析:
该题也是进行多次加操作、求最终和的问题。在这里要定义一个变量(s)记录小球反复落地总共经历的高度,还要定义一个变量(h)表示小球每次反弹起来的高度。需要注意的一点是,小球第一次落地时经历的路程为初始高度,即s初值为200,在第一次落地后,s中每次累加的是两倍的h值(弹起和再落下),这个过程只需再重复九次即可。 参考答案:
# include
{
float s=200,h=s/4; int i;
for(i=2;i<=10;i++) { s=s+2*h; h=h/4; }
printf(\ printf(\} 运行结果:
/*记录第一次落地经过的路程和第一次反弹的高度*/
6、设计程序sy3-6.c ,要求求出满足“百位减去十位等于个位”的所有三位整数,并按一行5个数输出结果。 算法分析:
该算法可用循环穷举所有的三位整数,逐一判断是否满足条件,并设置一个计数器,计找到的满足条件数的个数,当计数器为5的倍数的时候输出回车换行。 参考答案:
# include
int n=0,a,b,c,i; //计数器n要赋初值0 for(i=100;i<=999;i++) //穷举所有的三位整数 {
a=i/100; //分解百位 b=i/10; //分解十位 c=i; //分解个位 if(a-b==c)
{ printf(\
//输出满足条件的数
n++;
if(n%5==0) printf(\ }
}
printf(\} 运行结果:
7、设计程序sy3-7.c ,要求从键盘上输入整数m和k,输出大于且紧靠m的k个素数。 算法分析:
该题用到判素数的算法,从输入的m+1开始往上找,找够k个结束。 参考答案:
# include
int m,k,i,j,q;
printf(\scanf(\for(m=m+1; k>0 ;m++) { q=sqrt(m); //可以为q=m-1或q=m/2
for(j=2;j<=q;j++) if(m%j==0) break; if(j>q)
{ printf(\ k--; } }
printf(\}
运行结果:
8、中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?请编程解决该问题。(文件名存为sy3-8.c) 算法分析:
设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程:
5x+3y+z/3=100 x+y+z=100
所以此问题可归结为求这个不定方程的整数解。由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。 参考答案:
# include
void main() {
int x,y,z;
for(x=0;x<=20;x++) for(y=0;y<=33;y++)
{ z=100-x-y; //鸡的数目够100
if( z%3==0 && x*5+y*3+z/3==100 ) //购买鸡的钱够100,注意z必须是3的整数倍 printf(\ y:%d z:%d\\n\ //输出此种组合 } } 运行结果:
9、编写程序sy3-9.c ,输入一个正整数,计算并显示该整数的各位数字之和,例如,整型数1987的各位数字之和是1+9+8+7,等于25。 算法分析:
由于输入的整数位数不确定,所以用条件型循环while,逐一累加整数的个位,然后舍弃个位。 参考答案:
# include
printf(\ scanf(\