C语言程序设计(第五版)谭浩强 第五章习题答案

 第5章 循环结构程序设计

目录

1.请画出例5.6中给出的3个程序段的流程图。

2.请补充教材例5.7程序,分别统计当“fabs(t)>=1e-6”和“fabs(t)>=1e-8”时,执行循环体的次数。

3.输入两个正整数m和n,求其最大公约数和最小公倍数。

4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

5.求​[图片]之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:2+22+222+2222+22222(此时n=5)

6.求​[图片]即求(1!+2!+3!+4!+…+20!)。

7.求​[图片]。

8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=13+53+33。

9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1, 2, 3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1, 2, 3

10.有一个分数序列[图片]求出这个数列的前20项之和。

11.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

12.猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。

13.用迭代法求[图片]。求平方根的迭代公式为[图片]要求前后两次求出的x的差的绝对值小于。

14.用牛顿迭代法求下面方程在1.5附近的根:[图片]

15.用二分法求下面方程在(-10, 10)的根:[图片]

16.输出以下图案:

17.两个乒乓球队进行比赛,各出3人。甲队为A, B, C 3人,乙队为X, Y, Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X, Z比,请编程序找出3对赛手的名单。

1.请画出例5.6中给出的3个程序段的流程图。

(1)程序1:

#include <stdio.h>
int main() {
int i, j, n=0;
for(i=l; i<=4; i++)
	for(j=1; j<=5; j++, n++) {			//n用来累计输出数据的个数
		if(n%5 == 0)	printf("\n");	//控制在输出5个数据后换行
		printf("%d\t", i * j);
	}
printf("\n");
return 0;
}

(2)程序2:

#include <stdio.h>
int main() {
int i, j, n=0;
for(i=l; i<=4; i++)
	for(j=1; j<=5; j++, n++) {
		if(n%5 == 0)	printf("\n");	//控制在输出5个数据后换行
		if(i == 3 && j == 1)	break;	//遇到第3行第1列,结束内循环
		printf("%d\t", i * j);
	}
printf("\n");
return 0;
}

(3)程序3:

#include <stdio.h>
int main() {
int i, j, n=0;
for(i=l; i<=4; i++)
	for(j=1; j<=5; j++, n++) {
		if(n%5 == 0)	printf("\n");	//控制在输出5个数据后换行
		if(i == 3 && j == 1)	continue;	//遇到第3行第1列,终止本次内循环
		printf("%d\t", i * j);
	}
printf("\n");
return 0;
}

2.请补充教材例5.7程序,分别统计当“fabs(t)>=1e-6”和“fabs(t)>=1e-8”时,执行循环体的次数。

“fabs(t)>=1e-6”

#include <stdio.h>
#include <math.h>	// 程序中用到数学函数fabs,应包含头文件math.h
int main() {
	int sign=1, count=0;	// sign用来表示数值的符号,count用来累计循环次数
	double pi=0.0, n=1.0, term=1.0;	// pi开始代表多项式的值,最后代表的值,n代表分母,term代表当前项的值
	
	while(fabs(term) >= 1e-6) {	// 检查当前项term的绝对值是否大于或等于10的(-6)次方
		pi = pi + term;	// 把当前项term累加到pi中
		n = n + 2;	// n+2是下一项的分母
		sign = -sign;	// sign代表符号,下一项的符号与上一项符号相反
		term = sign / n;	// 求出下一项的值term
		count++;	// count累加1
	}
	pi = pi * 4;	// 多项式的和pi乘以4,才是π的近似值
	printf("pi=%10.8f\n", pi);	// 输出π的近似值
	printf("count=%d\n", count);	// 输出count的值

	return 0;
}

“fabs(t)>=1e-8”

#include <stdio.h>
#include <math.h>	// 程序中用到数学函数fabs,应包含头文件math.h
int main() {
	int sign=1, count=0;	// sign用来表示数值的符号,count用来累计循环次数
	double pi=0.0, n=1.0, term=1.0;	// pi开始代表多项式的值,最后代表的值,n代表分母,term代表当前项的值
	
	while(fabs(term) >= 1e-8) {
		pi = pi + term;	// 把当前项term累加到pi中
		n = n + 2;	// n+2是下一项的分母
		sign = -sign;	// sign代表符号,下一项的符号与上一项符号相反
		term = sign / n;	// 求出下一项的值term
		count++;	// count累加1
	}
	pi = pi * 4;	// 多项式的和pi乘以4,才是π的近似值
	printf("pi=%10.8f\n", pi);	// 输出π的近似值
	printf("count=%d\n", count);	// 输出count的值

	return 0;
}

3.输入两个正整数m和n,求其最大公约数和最小公倍数。
#include <stdio.h>

int main() {
	int m, n, x, y, t;
	printf("请输入m和n的值(m,n):");
	scanf("%d,%d", &m, &n);
	
	if(m >= n) {
		x = m;
		y = n;
	} else {
		x = n;
		y = m;
	}
	
	do {
		t = x % y;
		x = y;
		y = t;
	} while(t > 0);
	
	t = m * n / x;
	
	printf("\n最大公约数:%d,最小公倍数:%d\n", x, t);
	 
	return 0;
}

4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include <stdio.h>

int main() {
	char ch;
	int number = 0, letter = 0, blank = 0, other = 0;
	printf("请输入一行字符(以回车结束):");
	
	while((ch = getchar()) != '\n') {
		if(ch >= '0' && ch <= '9')	number++;
		else if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')	letter++;
		else if(ch == ' ')	blank++;
		else	other++;
	}
	
	printf("\n英文字母%d个,空格%d个,数字%d个,其他字符%d个\n", letter, blank, number, other);
	 
	return 0;
}

5.求之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:2+22+222+2222+22222(此时n=5)
#include <stdio.h>

int main() {
	int a, n, i = 0, sum = 0, t = 0;
	printf("请输入a和n的值(a,n):");
	scanf("%d,%d", &a, &n);
	
	while(i < n) {
		t = t * 10 + a;
		sum += t;
		i++;
	}
	
	printf("\nSn=%d (n=%d)\n", sum, n);
	
	return 0;
}

6.求即求(1!+2!+3!+4!+…+20!)。
#include <stdio.h>

int main() {
	int n = 20, i = 1;
	double sum = 0, t = 1;
	
	while(i <= n) {
		t = t * i;
		sum += t;
		i++;
	}
	
	printf("\nSn!=%22.15e (n=20)\n", sum);
	
	return 0;
}

7.求
#include <stdio.h>

int main() {
	int k;
	double sum = 0.0;
	
	for(k = 1; k <= 100; k++) {
		sum += k;
	}
	for(k = 1; k <= 50; k++) {
		sum += k * k;
	}
	for(k = 1; k <= 20; k++) {
		sum += 1.0 / k;
	}
	
	printf("\nS=%15.6lf\n", sum);
	
	return 0;
}

8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1^{3}+5^{3}+3^{3}
#include <stdio.h>

int main() {
	int i, a, b, c;
	
	for(i = 100; i < 1000; i++) {
		a = i / 100;
		b = i / 10 % 10;
		c = i % 10;
		if(i == a * a * a + b * b * b + c * c * c) {
			printf("%d\t", i);
		}
	}
	
	return 0;
}

9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1, 2, 3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1, 2, 3
#include <stdio.h>

int main() {
	int i, j, sum;
	
	for(i = 2; i < 1000; i++) {
		sum = 0;
		for(j = 1; j < i; j++) {
			if(i % j != 0)	continue;
			sum += j;
		}
		
		if(i == sum) {
			printf("\n%d its factors are ", i);
			for(j = 1; j < i; j++)
				if(i % j == 0)	printf("%d ", j);
			printf("\n");
		}
	}
	
	return 0;
}

10.有一个分数序列求出这个数列的前20项之和。
#include <stdio.h>

int main() {
	double a = 1.0, b = 2.0, sum = 0.0, t;
	int i = 1;
	
	while(i <= 20) {
		t = b / a;
		sum += t;
		b = a + b;
		a = b - a;
		i++;
	}
	
	printf("\nS=%16.10lf\n", sum);
	
	return 0;
}

11.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。
#include <stdio.h>

int main() {
	double h = 100.0, sum = 100.0;
	int i = 1;
	
	while(i <= 10) {
		h = h / 2;
		sum += h * 2;
		i++;
	}
	
	printf("\n共经过%lfm,第10次反弹%lfm\n", sum, h);
	
	return 0;
}

12.猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
#include <stdio.h>

int main() {
	int day = 10, sum = 1, t;
	
	while(day > 1) {
		t = (sum + 1) * 2 ;
		sum = t;
		day--;
	}
	
	printf("\n第1天共摘了%d个桃子\n", sum);
	
	return 0;
}

13.用迭代法求。求平方根的迭代公式为要求前后两次求出的x的差的绝对值小于10^{-5}
#include <stdio.h>
#include <math.h>

int main() {
	double x0, x1, a;
	
	printf("请输入a的值:");
	scanf("%lf", &a);
	
	x0 = a / 2;
	x1 = 1.0 / 2.0 * (x0 + a / x0);
	
	while(fabs(x0 - x1) >= 1e-5) {
		x0 = x1;
		x1 = 1.0 / 2.0 * (x0 + a / x0);
	}
	printf("\nx1=%8.5lf\n", x1);
	
	return 0;
}

14.用牛顿迭代法求下面方程在1.5附近的根:
#include <stdio.h>
#include <math.h>

int main() {
	double x0 = 0, x1 = 1.5, f0, f1;
	
	while(fabs(x1 - x0) >= 1e-5) {
		x0 = x1;
		f0 = 2 * pow(x0, 3) - 4 * pow(x0, 2) + 3 * x0 - 6;
		f1 = 6 * pow(x0, 2) - 8 * x0 + 3;
		x1 = x0 - f0 / f1;
	}
	
	printf("\nx1=%8.5lf\n", x1);
	
	return 0;
}

15.用二分法求下面方程在(-10, 10)的根:
#include <stdio.h>
#include <math.h>

int main() {
	double l = -10, r = 10, mid;
	
	while(r - l >= 1e-5) {
		mid = (l + r) / 2;
		if(2 * pow(mid, 3) - 4 * pow(mid, 2) + 3 * mid - 6 >= 0)	r = mid;
		else	l = mid;
	}
	
	printf("\nmid=%8.5lf\n", mid);
	
	return 0;
}

16.输出以下图案:

#include <stdio.h>
#include <math.h>

int main() {
	// 方法1
	int a = 1357531, b = 3210123, i;	// a是每行*号的个数,b是每行空格的个数 
	while(a) {
		for(i = 0; i < b % 10; i++)	printf(" ");
		
		for(i = 0; i < a % 10; i++)	printf("*");
		
		printf("\n");
		
		a /= 10;
		b /= 10;
	}
	
	// 方法2 
	/*int i, j, k;
	
	for(i = 0; i < 4; i++) {
		for(j = 0; j <= 2 - i; j++) {
			printf(" ");
		}
		for(k = 0; k <= 2 * i; k++) {
			printf("*");
		}
		printf("\n");
	}
	for(i = 0; i < 3; i++) {
		for(j = 0; j <= i; j++) {
			printf(" ");
		}
		for(k = 0; k <= 4 - 2 * i; k++) {
			printf("*");
		}
		printf("\n");
	}*/
	
	return 0;
}

 

17.两个乒乓球队进行比赛,各出3人。甲队为A, B, C 3人,乙队为X, Y, Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X, Z比,请编程序找出3对赛手的名单。
#include <stdio.h>

int main() {
	char i, j, k = 'Y';	// i, j, k分别对应A, B, C的对手,k的值为Y是因为题目限定C的对手不是X和Z,只能是Y 
	
	for(i = 'Y'; i <= 'Z'; i++) {	// i从Y开始是因为题目限定A的对手不是X 
		for(j = 'X'; j <= 'Z'; j++) {
			if(i == j)	continue;
			if(k == i || k == j)	continue;
			printf("A---%c\nB---%c\nC---%c", i, j, k);
		}
	}
	return 0;
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值