C程序设计(第5版)谭浩强习题解答 第5章 循环结构程序设计

C程序设计(第5版)谭浩强习题解答

第5章 循环结构程序设计

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

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

#include <stdio.h>
#include <math.h>                  //程序中用到数学函数fabs,应包含头文件math.n
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)          //检查当前项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);      //输出循环次数
	return 0;
}

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

#include <stdio.h>
int main()
{
	int  p, r, n, m, temp;
	printf("请输入两个正整数n,m:");
	scanf("%d,%d,", &n, &m);
	if (n < m)
	{
		temp = n;
		n = m;
		m = temp;
	}
	p = n * m;
	while (m != 0)
	{
		r = n % m;
		n = m;
		m = r;
	}
	printf("它们的最大公约数为:%d\n", n);
	printf("它们的最小公约数为:%d\n", p / n);
	return 0;
}

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

#include <stdio.h>
int main()
{
	char c;
	int letters = 0, space = 0, digit = 0, other = 0;
	printf("请输入一行字符:\n");
	while ((c = getchar()) != '\n')
	{
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
			letters++;
		else if (c == ' ')
			space++;
		else if (c >= '0' && c <= '9')
			digit++;
		else
			other++;
	}
	printf("字母数:%d\n空格数:%d\n数字数:%d\n其它字符数:%d\n", letters, space, digit, other);
	return 0;
}

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

#include <stdio.h>
int main()
{
	int  a, n, i = 1, sn = 0, tn = 0;
	printf("a,n=:");
	scanf("%d,%d", &a, &n);
	while (i <= n)
	{
		tn = tn + a;  //赋值后的tn为i个 a组成数的值
		sn = sn + tn; //赋值后的sn为多项式前i项之和
		a = a * 10;
		++i;
	}
	printf("a+aa+aaa+...=%d\n", sn);
	return 0;
}

6.求∑n=sum\limits_{n=1}^{20}n!(即求1!+2!+3!+4!+…+20!)。

#include <stdio.h>
int main()

{
	double s = 0, t = 1;
	int n;
	for (n = 1; n <= 20; n++)
	{
		t = t * n;
		s = s + t;
	}
	printf("1!+2!+...+20!=%22.15e\n", s);
	return 0;
}

7.∑k=sum\limits_{k=1}{100}k+sum\limits_{k=1}{50}{k}2+sum\limits_{k=1}{10}{\frac{1}{k}}。

#include <stdio.h>
int main()
{
	int n1 = 100, n2 = 50, n3 = 10;
	double k, s1 = 0, s2 = 0, s3 = 0;
	for (k = 1; k <= n1; k++)  //计算1到100的和
	{
		s1 = s1 + k;
	}
	for (k = 1; k <= n2; k++)  //计算1到50各数的平方和
	{
		s2 = s2 + k * k;
	}
	for (k = 1; k <= n3; k++)  //计算1到10的各倒数和
	{
		s3 = s3 + 1 / k;
	}
	printf("sum=%15.6f\n", s1 + s2 + s3);
	return 0;
}

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

#include <stdio.h>
int main()
{
	int i, j, k, n;
	printf("parcissus numbers are ");
	for (n = 100; n < 1000; n++)
	{
		i = n / 100;
		j = n / 10 - i * 10;
		k = n % 10;
		if (n == i * i*i + j * j*j + k * k*k)
			printf("%d ", n);
	}
	printf("\n");
	return 0;
}

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

//4.9.1
#define M 1000             //定义寻找范围
#include <stdio.h>
int main()
{
	int k1, k2, k3, k4, k5, k6, k7, k8, k9, k10;
	int i, a, n, s;
	for (a = 2; a <= M; a++)      //a是2-1000之间的整数,检查它是否完数 
	{
		n = 0;                  //n用来累计a的因子的个数 
		s = a;                  //s用来存放尚未求出的因子之和,开始时等于a 
		for (i = 1; i < a; i++)    //检查i是否a的因子 
			if (a%i == 0)        //如果i是a的因子 
			{
				n++;                 //n加1,表示新找到一个因子 
				s = s - i;               //s减去已找到的因子,s的新值是尚未求出的因子之和 
				switch (n)            //将找到的因子赋给k1...k9,或k10 
				{
				case 1:
					k1 = i;  break;   //找出的笫1个因子赋给k1 
				case 2:
					k2 = i;  break;   //找出的笫2个因子赋给k2 
				case 3:
					k3 = i;  break;   //找出的笫3个因子赋给k3 
				case 4:
					k4 = i;  break;   //找出的笫4个因子赋给k4 
				case 5:
					k5 = i;  break;   //找出的笫5个因子赋给k5 
				case 6:
					k6 = i;  break;    //找出的笫6个因子赋给k6 
				case 7:
					k7 = i;  break;   //找出的笫7个因子赋给k7 
				case 8:
					k8 = i;  break;    //找出的笫8个因子赋给k8 
				case 9:
					k9 = i;  break;   //找出的笫9个因子赋给k9 
				case 10:
					k10 = i;  break;   //找出的笫10个因子赋给k10 
				}
			}
		if (s == 0)
		{
			printf("%d ,Its factors are ", a);
			if (n > 1)  printf("%d,%d", k1, k2);        //n>1表示a至少有2个因子 
			if (n > 2)  printf(",%d", k3);             //n>2表示至少有3个因子,故应再输出一个因子 
			if (n > 3)  printf(",%d", k4);             //n>3表示至少有4个因子,故应再输出一个因子 
			if (n > 4)  printf(",%d", k5);             //以下类似 
			if (n > 5)  printf(",%d", k6);
			if (n > 6)  printf(",%d", k7);
			if (n > 7)  printf(",%d", k8);
			if (n > 8)  printf(",%d", k9);
			if (n > 9)  printf(",%d", k10);
			printf("\n");
		}
	}
	return 0;
}


//4.9.2
#include <stdio.h>
int main()
{
	int m, s, i;
	for (m = 2; m < 1000; m++)
	{
		s = 0;
		for (i = 1; i < m; i++)
			if ((m%i) == 0) s = s + i;
		if (s == m)
		{
			printf("%d,its factors are ", m);
			for (i = 1; i < m; i++)
				if (m%i == 0)  printf("%d ", i);
			printf("\n");
		}
	}
	return 0;
}

10.有一个分数序列,求出这个数列的前20项之和。2/1,3/2,5/3,8/5,13/8,21/13,…

#include <stdio.h> 
int main()
{
	int i, n = 20;
	double a = 2, b = 1, s = 0, t;
	for (i = 1; i <= n; i++)
	{
		s = s + a / b;
		t = a,
			a = a + b,
			b = t;
	}
	printf("sum=%16.10f\n", s);
	return 0;
}

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

#include <stdio.h> 
int main()
{
	double sn = 100, hn = sn / 2;
	int n;
	for (n = 2; n <= 10; n++)
	{
		sn = sn + 2 * hn;   //第n次落地时共经过的米数
		hn = hn / 2;      //第n次反跳高度
	}
	printf("第10次落地时共经过%f米\n", sn);
	printf("第10次反弹%f米\n", hn);
	return 0;
}

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

#include <stdio.h> 
int main()
{
	int day, x1, x2;
	day = 9;
	x2 = 1;
	while (day > 0)
	{
		x1 = (x2 + 1) * 2;    //第1天的桃子数是第2天桃子数加1后的2倍.
		x2 = x1;
		day--;
	}
	printf("total=%d\n", x1);
	return 0;
}

13.用迭代法求x=qrt{a}。求平方根的迭代公式为x_{n+1}=1/2(x_{n}+frac{a}{x_n}要求前后两次求出的x的差的绝对值小于10^−5

#include <stdio.h>
#include <math.h>
int main()
{
	float a, x0, x1;
	printf("enter a positive number:");
	scanf("%f", &a);
	x0 = a / 2;
	x1 = (x0 + a / x0) / 2;
	do
	{
		x0 = x1;
		x1 = (x0 + a / x0) / 2;
	} while (fabs(x0 - x1) >= 1e-5);
	printf("The square root of %5.2f  is %8.5f\n", a, x1);
	return 0;
}

14.用牛顿迭代法求下面方程在1.5附近的根:2x3-4x2+3x-6=0

#include <stdio.h>
#include <math.h>
int  main()
{
	double x1, x0, f, f1;
	x1 = 1.5;
	do
	{
		x0 = x1;
		f = ((2 * x0 - 4)*x0 + 3)*x0 - 6;
		f1 = (6 * x0 - 8)*x0 + 3;
		x1 = x0 - f / f1;
	} while (fabs(x1 - x0) >= 1e-5);
	printf("The root of equation is %5.2f\n", x1);
	return 0;
}

15.用二分法求下面方程在(-10,10)的根:2x3-4x2+3x-6=0

#include <stdio.h>
#include <math.h>
int main()
{
	float x0, x1, x2, fx0, fx1, fx2;
	do
	{
		printf("enter x1 & x2:");
		scanf("%f,%f", &x1, &x2);
		fx1 = x1 * ((2 * x1 - 4)*x1 + 3) - 6;
		fx2 = x2 * ((2 * x2 - 4)*x2 + 3) - 6;
	} while (fx1*fx2 > 0);
	do
	{
		x0 = (x1 + x2) / 2;
		fx0 = x0 * ((2 * x0 - 4)*x0 + 3) - 6;
		if ((fx0*fx1) < 0)
		{
			x2 = x0;
			fx2 = fx0;
		}
		else
		{
			x1 = x0;
			fx1 = fx0;
		}
	} while (fabs(fx0) >= 1e-5);
	printf("x=%6.2f\n", x0);
	return 0;
}

16.输出以下图案:

					   *
                      ***
                     ***** 
                    *******
                     *****
                      ***
                       *  
#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;
}

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;            //是a的对手;j是b的对手;k是c的对手
	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("A--%c\nB--%c\nC--%c\n", i, j, k);
	return 0;
}
  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值