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

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

scanf出问题请看:超简单的scanf错误修改

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

fabs(t)>= le- 6 :

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

int main()
{
    
    
	int sign = 1;
	double pi = 0.0, term = 1.0;
	int n = 0;

	while (fabs(term) >= 1e-6)
	{
    
    
		n++;
		term = 1.0 / (2 * n - 1)*sign;
		pi += term;
		sign = -sign;
	}
	pi *= 4;
	printf("pi的近似值是%lf\n", pi);
	printf("循环体循环了%d次\n", n);
	return 0;
}

fabs(t)> = le- 8:

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

int main()
{
    
    
	int sign = 1;
	double pi = 0.0, term = 1.0;
	int n = 0;

	while (fabs(term) >= 1e-8)
	{
    
    
		n++;
		term = 1.0 / (2 * n - 1)*sign;
		pi += term;
		sign = -sign;
	}
	pi *= 4;
	printf("pi的近似值是%lf\n", pi);
	printf("循环体循环了%d次\n", n);
	return 0;
}

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

#include <stdio.h>
int main()
{
    
    
	int  p, r, n, m, temp;
	printf("请输入两个正整数n,m:");
	scanf("%d%d,", &n, &m);
	//调整n保存较大的值
	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;
	//定义eng_char为英文字母的个数,初始值为0
	//定义space_char为空格字符的个数,初始值为0
	//定义digit_char为数字字符的个数,初始值为0
	//定义other_char为其他字符的个数,初始值为0
	int eng_char = 0, space_char = 0, digit_char = 0, other_char = 0;
	printf("请输入一行字符:");
	while ((c = getchar()) != '\n')
	{
    
    
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
		{
    
    
			eng_char++;
		}
		else if (c == ' ')
		{
    
    
			space_char++;
		}
		else if (c >= '0' && c <= '9')
		{
    
    
			digit_char++;
		}
		else
		{
    
    
			other_char++;
		}
	}

	printf("英文字母数量:%d\n空格数量:%d\n数字数量:%d\n其他字符数量:%d\n", eng_char, space_char, digit_char, other_char);
	return 0;
}

5.求在这里插入图片描述

之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:

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

int main()
{
    
    
	//n为a的个数
	int n;
	double a, prev_sum = 0.0, total_sum = 0.0;
	printf("请输入a的值以及n的值: ");
	scanf("%lf %d", &a, &n);
	//循环n次求总和
	for (int i = 0; i < n; i++)
	{
    
    
		prev_sum += a * pow(10, i); 
		total_sum += prev_sum;
	}
	printf("总和为:%lf\n", total_sum);
	return 0;
}

6.求在这里插入图片描述(即求1!+2!+3!+4!+…+20!)。

#include<stdio.h>

int main()
{
    
    
	double total_sum = 0;
	for(int i = 1; i <= 20; i++) 
	{
    
    
		double single_sum = 1;
		for (int j = i; j > 0; j--)
		{
    
    
			single_sum *= j;
		}
		total_sum += single_sum;
	}
	printf("1~20每个数字阶乘总和为:%lf\n",total_sum);
	return 0;
}

在这里插入图片描述

7.在这里插入图片描述

#include <stdio.h>

int main()
{
    
    
	double total_sum = 0, sum1 = 0, sum2 = 0, sum3 = 0.0;
	for (int k = 1; k <= 100; k++)
	{
    
    
		sum1 += k;
		//遍历50次就不在执行情况2
		if (k <= 50)
		{
    
    
			sum2 += k * k;
		}
		//遍历10次就不在执行情况3
		if (k <= 10)
		{
    
    
			sum3 += 1.0 / k;
		}
	}
	total_sum = sum1 + sum2 + sum3;
	printf("三种情况求和结果为:%lf\n", total_sum);
	return 0;
}

在这里插入图片描述

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

#include <stdio.h>

int main()
{
    
    
	 //a表示百位数字,b表示十位数字,c表示各位数字
	int a, b, c;
	for (int i = 100; i <= 999; i++)
	{
    
    
		a = i / 100;
		b = (i / 10) % 10;
		c = i % 10;
		if (a * a * a + b * b * b + c * c * c == i)
		{
    
    
			printf("%d\n", i);
		}
	}
	return 0;
}

在这里插入图片描述

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

#include<stdio.h>

int main()
{
    
    
	int data, fator, sum;      /* data表示要判断的数,fator表示因子,sum表示因子之和*/

	for (data = 2; data <= 1000; data++)
	{
    
    
		//1是所有整数的因子,所以因子之和从1开始
		sum = 1;
		for (fator = 2; fator <= data / 2; fator++)
		{
    
    
			/* 判断data能否被fator整除,能的话fator即为因子  因子不包括自身 */
			if (data % fator == 0)
			{
    
    
				sum += fator;
			}
		}
		// 判断此数是否等于因子之和 */
		if (sum == data)    
		{
    
    
			printf("%d its factors are 1, ", data);
			for (fator = 2; fator <= data / 2; fator++)
			{
    
    
				if (data % fator == 0)
				{
    
    
					printf("%d, ", fator);
				}
			}
			printf("\n");
		}
	}
	return 0;
}

10.有一个分数序列,求出这个数列的前20项之和。

在这里插入图片描述

#include <stdio.h> 
//定义循环次数
#define COUNT 20

int main()
{
    
    
	//定义第一个分式的分子为a, 值为2; 定义分母为b,值为1
	//定义相加的和为sum,初始值为0
	double a = 2, b = 1, sum = 0;
	double temp;

	for (int i = 0; i < COUNT; i++)
	{
    
    
		sum += a / b;
		//记录前一项分子
		temp = a;
		//前一项分子与分母之和为后一项分子
		a = a + b;
		//前一项分子为后一项分母
		b = temp;
	}
	printf("前%d项之和为:sum=%9.7f\n", COUNT, sum);
	return 0;
}

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

#include <stdio.h>

int main()
{
    
    
	//总高度
	double total_m = 100.0;
	//小球经历的米数
	double total_sum = 0.0;
	for (int i = 0; i < 10; i++)
	{
    
    
		total_sum += total_m;
		total_m /= 2;
		total_sum += total_m;
	}
	//不需要计算第10次的反弹高度,所以减去
	total_sum -= total_m;
	printf("小球总共经历%lf米, 第10次反弹%lf米\n", total_sum, total_m);
	return 0;
}

在这里插入图片描述

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

#include <stdio.h>

int main()
{
    
    
	int day = 9;
	int prev_day_count;
	int cur_day_count = 1;
	while (day > 0)
	{
    
    
		prev_day_count = (cur_day_count + 1) * 2;
		cur_day_count = prev_day_count;
		day--;
	}
	printf("total count : %d\n", cur_day_count);
	return 0;
}

在这里插入图片描述

13.用迭代法求x=求平方根的迭代公式为在这里插入图片描述要求前后两次求出的x的差的绝对值小于10^(-5)

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

int main()
{
    
    
	float a, x0, x1;
	printf("请输入一个正数: ");
	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("[%f] 的平方根为 [%f]\n", a, x1);
	return 0;
}

在这里插入图片描述

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

在这里插入图片描述

#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("方程在1.5附近的根为:%lf\n", x1);
	return 0;
}

在这里插入图片描述

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

在这里插入图片描述

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

int main()
{
    
    
	double left = -10, right = 10, mid;
	double temp = 10;
	while (fabs(temp) > 1e-5)
	{
    
    
		mid = (left + right) / 2;
		//((2x - 4)*x + 3) * x - 6 ==> 2x^3 - 4x^2 + 3x -6
		temp = ((2 * mid - 4) * mid + 3) * mid - 6;

		if (temp > 0)
		{
    
    
			right = mid;
		}
		else if (temp < 0)
		{
    
    
			left = mid;
		}
	}
	printf("在(-10,10)的根为:%lf", mid);
	return 0;
}

16.输出以下图案:

在这里插入图片描述

#include <stdio.h>

int main()
{
    
    
	int cur_row, space_count, start_count;
	//输出前4行内容
	for (cur_row = 0; cur_row < 4; cur_row++)
	{
    
    
		//计算当前行空格数量,并且进行打印
		for (space_count = 3 - cur_row; space_count > 0; space_count--)
		{
    
    
			printf(" ");
		}
		//计算当前行*数量,并且进行打印
		for (start_count = 2 * cur_row + 1; start_count > 0; start_count--)
		{
    
    
			printf("*");
		}
		printf("\n") ;
	}
	//输出后三行
	for (cur_row = 0; cur_row < 3; cur_row++)
	{
    
    
		for (space_count = cur_row + 1; space_count > 0; space_count--)
		{
    
    
			printf(" ");
		}

		for (start_count = 7 - 2 * (cur_row + 1); start_count > 0; start_count--)
		{
    
    
			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()
{
    
    
	int A_battle, B_battle, C_battle;
	//如果A对战的对象从“X”到“Z”
	for (A_battle = 'X'; A_battle <= 'Z'; A_battle++)
	{
    
    
		//如果B对战的对象从“X”到“Z”
		for (B_battle = 'X'; B_battle <= 'Z'; B_battle++)
		{
    
    
			//如果C对战的对象从“X”到“Z”
			for (C_battle = 'X'; C_battle <= 'Z'; C_battle++)
			{
    
    
				//去除限制条件
				if (A_battle == 'X' || C_battle == 'X' || C_battle == 'Z' || B_battle == A_battle || B_battle == C_battle || A_battle == C_battle)
				{
    
    
					continue;
				}
				printf("A对%c,B对%c,C对%c", A_battle, B_battle, C_battle);
			}
		}
	}
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kris_paul/article/details/113483510