谭浩强C程序设计第四版第五章课后答案

谭浩强C程序设计第四版第五章课后答案

2.测试一下一个是5000001次一个是50000001次
3.最大公约数用辗转相除法,最大公约数与最小公倍数的乘积正好是两个数的乘积

#include <stdio.h>

int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int t;
	if ( m < n )
	{
		t = m;
		m = n;
		n = t;
	}
	//辗转相除法求得最大公约数
	int a = m,b = n;
	while( m % n)
	{
		t = m % n;
		m = n;
		n = t;
	}
	printf("最大公约数为 : %d\n最小公倍数为 : %d\n",n,a * b/n);
	return 0;
}

4.getchar()遇到’\n’停止

#include <stdio.h>

int main()
{
	char c;
	int character = 0,space = 0,number = 0,other = 0;
	while( (c = getchar()) != '\n')
	{
		if ( c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z')
		{
			character++;
		}
		else if ( c >= '0' && c <= '9')
		{
			number++;
		}
		else if ( c == ' ')
		{
			space++;
		}
		else
			other++;
	}
	printf("字母有 %d 个。\n",character);
	printf("数字有 %d 个。\n",number);
	printf("空格有 %d 个。\n",space);
	printf("其他有 %d 个。\n",other);
	return 0;
}

5.找规律

#include <stdio.h>

int main()
{
	int a,n,s = 0;
	scanf("%d%d",&a,&n);
	int a1 = a;
	for ( int i = 0;i < n;i++)
	{
		s = s + a;
		a = a * 10 + a1;
	}
	printf("s = %d\n",s);
	return 0;
}

6.求前20项阶乘和

#include <stdio.h>

int main()
{
	int jc = 1;
	int sum = 0;
	for ( int i = 1;i <= 20;i++)
	{
		for ( int j = 1;j <= i;j++)
		{
			jc = jc * j;
		}
		sum = sum + jc;
	}
	printf("sum = %d",sum);
	return 0;
}

7.注意范围,多两个判断可以少两个循环

#include <stdio.h>

int main()
{
	double sum = 0.0;
	for ( int i = 1;i <= 100;i++)
	{
		if ( i <= 50)
		{
			if ( i <= 10)
			{
				sum = sum + i + i * i + 1.0/i;
			}
			else
				sum = sum + i + i * i;
		}
		else
			sum = sum + i;
	}
	printf("sum = %f",sum);
	return 0;
}

8.水仙花数、判断

#include <stdio.h>

int main()
{
	int a;
	scanf("%d",&a);
	if ( a == (a/100)^3 + (a / 10 % 10)^3 + (a % 10)^3)
	{
		printf("%d 是一个水仙花数。\n",a);
	}
	else
		printf("%d 不是一个水仙花数。\n",a);
}

9.完数:从2开始求因子,求和判断

#include <stdio.h>

int main()
{
	int n,s = 0;
	scanf("%d",&n);
	for (int i = 2;i <= n;i++)
	{
		if ( n % i == 0)
		{
			s = s + n/i;
		}
	}
	if ( s == n)
	{
		printf("%d 是一个完数\n",n);
	}
	else
		printf("%d 不是一个完数\n",n);
	return 0;
}

10.找规律

#include <stdio.h>

int main()
{
	double up = 2.0,down = 1.0,sum = 0.0;
	for (int i = 0;i<20;i++)
	{
		sum = up/down + sum;
		int t = up;
		up = down +up;
		down = t;
	}
	printf("sum = %6.2lf\n",sum);
	return 0;
	
}

11.皮球落地问题

#include <stdio.h>

int main()
{
	double height = 100.0,s = 100.0;
	for (int i = 1;i < 10 ;i++)
	{
		height = height/2;
		s = s + height * 2;
	}
	printf("第10次高度为 height = %lf\n总路径长为 s = %lf\n",height,s);
	return 0;
	
}

12.猴子吃桃问题,可以把摘桃那天看成吃桃的前一天,避免考虑太多

// 例12猴子吃桃.cpp
//Sn-1 = Sn /2 - 1
// Sn  = (Sn-1 + 1) * 2

#include "stdio.h"
int main()
{
	int S = 1;
	for (int i = 0;i < 10;i++)
	{
		S = 2 * ( S + 1 );
	}
	printf("第一天共摘了 %d 个桃子。\n",S);
	return 0;
}

13.迭代法求根号a。

#include <stdio.h>
#include <math.h>
int main()
{
	double x1 = 1.0,x2 = 0,t = x1,a;
	scanf("%lf",&a);

	while(fabs(t - x2) > 1e-5)
	{
		x2 = 0.5 * ( x1 + a / x1);
		t = x1;
		x1 = x2;
	}
	printf("根号a = %lf",x1);
	return 0;
}

14.牛顿法求方程根

#include <stdio.h>
#include <math.h>
int main()
{

	float x = 1.5;
	float x0 = 0;
	float f;
	float fd;

	while(fabs(x - x0)>= 1e-5)
	{
		x0 = x;
		f = 2 * x0 * x0 * x0  - 4 * x0 * x0 + 3 * x0 - 6;
		fd = 3 * 2 * x0 * x0 - 2 * 4 * x0 +34;
		x = x0 - f / fd;  
	}
	printf("解为 %lf \n",x);
	return 0;
}

15.二分法求方程根

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

double EPS = 1e-6;

int main()	
{
	double x1 = -10, x2 = 10,y;
	double x;
	x = x1+(x2-x1)/2;
	y = 2 * x*x*x - 4 * x * x + 3 * x - 6;
	while( fabs(y) > EPS) {
		if( y > 0 ) 
			x2 = x; 
		else	
			x1 = x;

		x = x1+(x2 - x1)/2;

		y = 2 * x*x*x - 4 * x * x + 3 * x - 6;;
	}
	printf("%.6f\n",x); 
	return 0;	
}

16.输出图案

#include <stdio.h>

int main()
{
	for (int i = 1;i <= 4 ;i++)
	{
		for ( int j = 3 - i + 1; j > 0 ;j--)
		{
			printf(" ");
		}
		for (int k = 0;k < i * 2-1;k++)
		{
			printf("*");
		}
		printf("\n");
	}
	int k = 5;
	for ( int i = 1; i <= 3;i++)
	{
		for (int j = 0;j < i;j++)
		{
			printf(" ");
		}
		for(int m = 0;m < k;m++)
		{
		printf("*");
		}
		printf("\n");
		k = k - 2;
	}
	return 0;
}

17.乒乓球比赛,这题还蛮有意思的,主要学会建立模型

#include <stdio.h>

int main()
{
	for (int i = 0;i < 3;i++)
	{
		for (int j = 0;j <3;j++)
		{
			//A和B的对手不能一样
			if ( i != j)
			{
				for (int k = 0;k < 3;k++)
				{
					//C和AB的对手都不一样
					if ( k != i && k!= j)
					{
						//A不和X比 C不和X和Z比
						if ( i != 0 && k != 0 && k != 2)
						{
							printf("A---%c\nB---%c\nC---%c\n",i + 'X',j + 'X',k + 'X');
						}
					}
				}
			}
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值