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

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

  • 第五章
    • 1.略
    • 2.略
    • 3.输入两个正数m和n,求其最大公约数和最小公倍数
    • 4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符得个数
    • 5.求Sn = a + aa + aaa + ··· + aa···aa的值,其中a表示一个数字,n表示a的位数,n由键盘输入。
    • 6. 求 ∑ n = 1 20 20 ! \sum_{n=1}^{20} 20! n=12020
    • 7. 求 ∑ k = 1 100 k + ∑ k = 1 50 k 2 + ∑ k = 1 10 1 / k \sum_{k=1}^{100} k+\sum_{k=1}^{50}k^2+\sum_{k=1}^{10}{1/k} k=1100k+k=150k2+k=1101/k
    • 8.输出所有的水仙花数
    • 9.找出1000以内的所有完数
    • 10.分数序列,求前20项和
    • 11.一个球从100m高度自由落下, 每次落地后反弹回原高度的一半,再落下,再反弹,求他第10次落地时,共经过多少米,第10次反弹多高。
    • 12.猴子吃桃问题
    • 13.用迭代法求出 x = a x = \sqrt{a} x=a
    • 14.用牛顿迭代法求出下面方程在1.5附近的根
    • 15.用二分法求2x^3^-4x^2^+3x-6=0在(-10,10)之间的根
    • 16.输出图案
    • 17.两个乒乓球队进行比赛,各出三人。甲队为A,B,C3人,乙队为X,Y,Z3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程找出3对赛手的名单。

第五章

1.略

2.略

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

#include <stdio.h>
#include <iostream>
using namespace std;
int fun1(int m,int n){
	//辗转相除法
	int temp;
	while(n != 0){
		temp = m % n;
		m = n;
		n = temp;
	}
	return m;
	//或递归调用
	//if(m % n == 0){
	//	return n;
	//}
	//return fun1(m , m % n);
}
int fun2(int m,int n){
	//最小公倍数=m*n/最大公约数
	int temp = fun1(m,n);
	int res = m * n / temp;
	return res;
	
}
int main(){
	int m,n;
	scanf("%d,%d",&m,&n);
	int a = fun1(m,n);//最大公约数
	int b = fun2(m,n);//最小公倍数
	printf("最大公约数:%d\n",a);
	printf("最小公倍数:%d\n",b);
	return 1;
}

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

#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
	int n;
	printf("请输入要判断字符的最大长度:");
	scanf("%d",&n);
	char s[n];
	int a = 0;//用于记录中英文数
	int b = 0;//用于记录空格数
	int c = 0;//用于记录数字个数
	int d = 0;//用于记录其他字符
	scanf("%s",&s);
	for(int i = 0 ; i < n ; ++i){
		if(s[i]>=65 && s[i]<= 90){
			//记录A-Z
			++a;
		}else if(s[i]>= 97 && s[i]<= 122){
			//记录a-z
			++a;
		}else if(s[i] == " "){
			//记录空格
			++b;
		}else if(s[i] >= 48 && s[i] <= 57){
			//记录0-9
			++c;
		}else if(s[i] != '/0'){
			//记录其他字符
			++d;
		}else{
			break;
		}
	}
	printf("英文字母共有:%d,空格有:%d,数字有:%d,其他字符有:%d\n",a,b,c,d);
	return 1;
}

5.求Sn = a + aa + aaa + ··· + aa···aa的值,其中a表示一个数字,n表示a的位数,n由键盘输入。

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
long int gen(int n, int a){
	long int res = 0;
	if(n == 0)
		return a;
	for(int i = n; i > 0 ; --i){
		res += a*pow(10,i);
	}
	res += a;
	return res;
}
int main(){
	int a;
	int n;
	scanf("%d,%d",&a,&n);
	long int res = 0;
	for(int i = 0 ; i < n ; ++i){
		res += gen(i,a);
	}
	printf("Sn = %d\n",res);
	return 1;
}

6. 求 ∑ n = 1 20 20 ! \sum_{n=1}^{20} 20! n=12020

#include <iostream>
#include <stdio.h>
using namespace std;
long int fac(int n){
	long int res = 0;
	for(i = 1 ; i< = n ; ++i){
		res *= i;
	}
	return res;
}
int main(){
	int n = 20;
	long int res = 0 ;
	for(int i = 1 ; i <= n ; ++i){
		res += fac(i);
	}
	printf("sum(20!) = %d\n",res);
	return 1;
}

7. 求 ∑ k = 1 100 k + ∑ k = 1 50 k 2 + ∑ k = 1 10 1 / k \sum_{k=1}^{100} k+\sum_{k=1}^{50}k^2+\sum_{k=1}^{10}{1/k} k=1100k+k=150k2+k=1101/k

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int main(){
	double res = 0;
	for(int i = 1 ; i <= 100 ; ++i){
		res += i;
	}
	for(int i = 1 ; i <= 50 ; ++i){
		res += i*i;
	}
	for(int i = 1 ; i <= 10 ; ++i){
		res += 1/i;
	}
	printf("sum = %f\n",res);
	return 1;
}

8.输出所有的水仙花数

水仙花数是指一个三位数其个位数字的立方和等于该数本身

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main(){
	int a,b,c,sum;
	for(int i = 100 ; i < 1000 ; ++i){
		a = i/100;
		b = (i-a*100)/10;
		c = i-a*100-b*10;
		sum = pow(a,3)+pow(b,3)+pow(c,3);
		if(sum == i)
			printf("%d是水仙花数\n",i);
	}
	return 1;
}

9.找出1000以内的所有完数

一个数恰巧等于它的因子之和,称为完数。

#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
	int sum = 0;
	for(int i = 1 ; i <= 1000 ; ++i){
		for(int j = 1 ; j < i ; ++j){
			if(i%j == 0)
				sum += j;
		}
		if(sum == i)
			printf("%d 是完数\n",i);
		sum = 0;
	}
	return 1;
}

10.分数序列,求前20项和

2/1,3/2,5/3,8/5,13/8,21/13,···

#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
	int a = 1;
	int b = 2;
	int c;
	double res = 0;
	for(int i = 0; i < 20 ; ++i){
		res += b/a;
		c = a;
		a = a+b;
		b = c;
	}
	printf("sum = %f\n",res);
	return 1;
}

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

#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
	double h = 100;
	double distance = 0;
	double reback = 0;
	for(int i = 0 ; i < 10 ; ++i){
		distance += 1.5*h;
		h /= 2;
		reback = h;
	}
	h -= reback;
	printf("球在第10次落地时共经过%fm,第10次反弹%fm\n",distance,reback);
}

12.猴子吃桃问题

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

#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
	int peach = 1;
	for(int i = 0 ; i < 9 ; ++i){
		peach += 1;
		peach *= 2;
	}
	printf("Total peach is %d\n",peach);
	return 1;
}

13.用迭代法求出 x = a x = \sqrt{a} x=a

Xn+1 = 1 / 2( Xn + a / Xn ),其中前后两次求出x的差的绝对值小于10-5

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main(){
    double a,x0,x1;
    scanf("%lf",&a);
    x0 = a;
    x1 = (x0 + a / x0) / 2;
    double abs = pow(10,-5);
    while (fabs(x0 - x1) >= abs) {
        x0 = x1;
        x1 = (x0 + a / x0) / 2;
    }
    printf("x = %f\n",x1);
    printf("x = sqrt(%lf) = %f\n",a,sqrt(a));
    return 1;
}

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

2x3-4x2+3x-6=0

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int main(){
//牛顿迭代法思路就是Xn+1 = Xn - F(x)/F'(X)
	double x0,x1;
	x0 = 1.5;
	x1 = 0;
	int count = 0;
	double abs = pow(10,-5);
	while(fabs(x1-x0) >= abs){
		x0 = x0 - (2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);
		x1 = x0 - (2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);
		++count;
		printf("第%d次迭代:x0 = %f,x1 = %f\n",count,x0,x1);
	}
	printf("共迭代%d次\n",count);
	printf("%f\n",x1);
	return 1;
}

15.用二分法求2x3-4x2+3x-6=0在(-10,10)之间的根

暂略,后序补上

16.输出图案

#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
//分两次处理,第一次处理前4行,第二次处理后三行
//以中间点为中心,从两边向中间输出“ ”
    int n = 3;
    for(int i = 0 ; i < 4 ; ++i){
        char c[] = "*******";
        for(int j = 0 ; j < n; ++j){
            c[j] = ' ';
            c[6-j] = ' ';
        }
        --n;
        printf("%s\n",c);
        if(n < 0)
            break;
    }
    n = 1;//让n从1开始重新计数
    //后3行思路与上面相似
    for(int i = 0 ; i < 3 ; ++i){
        char c[] = "*******";
        for(int j = 0 ; j < n ; ++j){
            c[j] = ' ';
            c[6-j] = ' ';
        }
        ++n;
        printf("%s\n",c);
        if(n > 3)
            break;
    }
    return 1;
}

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

#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
    char A,B,C;
    for(B='X';B<='Z';++B){
    	//B无限制,故先循环B
        for(A = 'X' ; A <= 'Z' ; ++A){
        //A不允许和X比赛,则如果A==X终止当前循环
            if(A == 'X')
                continue;
            else{
                for(C = 'X' ; C < 'Z' ; ++C){
                //C不允许和X,Z比赛,并且此时还应该满足A!=B!=C
                    if(C == 'X' || A == B || A == C || B == C)
                        continue;
                    else{
                    //均满足时,输出结果
                        printf("%c,%c,%c",A,B,C);
                    }
                }
            }
        }
    }
    return 1;
}

你可能感兴趣的:(C语言程序设计谭浩强版课后习题)