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

简介: C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)

前言:本章详细讲解C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)

3.给两个数m和n输入最大公约数和最小公倍数

最大公约数分为穷举法和辗转相除法

代码如下:

//穷举法.最大公约数

#include<stdio.h>

int main() {

int j = 0;

int m, n, i;

scanf_s("%d %d", &m, &n);

i = m > n ? m : n;

while (!j) {

 if (!(m % i) && !(n % i)) {

  printf("%d", i);

  j++;

 }

 else i--;

}

return 0;

}

//辗转相除法.最大公约数

#include<stdio.h>

void swap(int x, int y);

int main() {

int m, n, i;

scanf_s("%d %d", &m, &n);

swap(m, n);  //把m交换成两者的大值

i = m % n;

while (i) {

 m = n;n = i;i = m % n;   //辗转相除法核心

}

printf("%d", n);

return 0;

}

void swap(int x, int y) {  //交换

int m;

if (x < y) {

 m = x; x = y; y = m;

}

return;

}

最小公倍数

//最小公倍数

#include<stdio.h>

int main() {

int count = 0;    //计数,输出一个最小公倍数

int m, n, max;    

scanf_s("%d %d", &m, &n);

max = m > n ? m : n;    //找出两者中的最大值,记为max

while (!count) {

 if (!(max % m) && !(max % n)) {

  printf("%d", max);

  count++;

 }

 else max++;

}

return 0;

}

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

 

#include<stdio.h>

int main() {

char c;

int english = 0, space = 0, number = 0, other = 0;

while ((c = getchar()) != '\n') {

 if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'z')  

  english++;

 else if (c == ' ')    

  space++;

 else if (c >= '0' && c <= '9')  

  number++;

 else  other++;

}

printf("%d %d %d %d", english, space, number, other);

return 0;

}

6.求1!+2!+3!+...+20!   //累乘思想

 

#include<stdio.h>

int main() {

double p = 1,sum = 0;  //不应定义为int或者long(不能容纳所求得的结果)

for (int i = 1; i <= 20; i++) {

 p *= i;             //每项阶乘的值

 sum += p;

}

printf("%22.15e\n", sum);  //控制精度

return 0;

}

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

#include<stdio.h>

int main() {

int w[1000] = { 0 };     //储存a,aa,aaa每个数的值

int number = 0,sum=0;    //number为每个数的值,sum为Sn

int a, n;                //a是一个数字,n表示a的位数

scanf_s("%d %d", &a, &n);

for (int i = 1,count=1;count<=n; i *= 10) {

 number += a*i;

 w[count] = number;

 sum += w[count];

 count++;

}                         //采用简单粗暴算法,aaa=a*100+a*10+a

printf("%d", sum);

return 0;

}

上面那个太麻烦了,下面是改进

#include<stdio.h>

int main() {

int a,n;

int sum = 0,p=0;

scanf("%d %d" ,& a,&n);

for (int i = 1; i <= n; i++) {

 p = a+p * 10;     //每一项的值

 sum += p;         //求和

}

printf("%d", sum);

return 0;

}

7.k:1-100,k*k:1-50,1/k:1-10,求三者的和

 

#include<stdio.h>

#include<math.h>

int main() {

double sum = 0.0;

for (int k = 1; k < 101; k++) {

 sum += k;

}

for (int k = 1; k < 51; k++) {

 sum += pow(k,2);         //表示k*k

}

for (double k = 1.0; k < 11; k++) {

 sum += 1.0 / k;

}

printf("%f", sum);

return 0;

}

改进

//用了3个for,时间空间复杂度较大,改进:一个for循环中加入两个if判断

#include<stdio.h>

#include<math.h>

int main() {

double sum1 = 0.0,sum2=0.0,sum3=0.0;

for (int k = 1; k < 101; k++) {

 sum1 += k;

 if (k < 51) sum2 += pow(k, 2);         //表示k*k

 if (k < 11) sum3+= 1.0 / k;

}

printf("%f", sum1+sum2+sum3);

return 0;

}

8.输出所有的水仙花数

 

#include<stdio.h>

#include<math.h>

int main() {

int a, b, c;

for (int x = 100; x < 1000; x++) {

 a = x / 100;         //百位

 b = x % 100 / 10;    //十位

 c = x % 10;          //个位

 if (x == pow(a, 3) + pow(b, 3) + pow(c, 3))

  printf("%d\t", x);

}

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 num, sum, factor;//数,和,因子

for (num = 2; num <= 1000; num++) {

 sum = 1;      //1是所有数的因子

 for (factor = 2; factor <= num / 2; factor++) {

  if (num % factor == 0) sum += factor;

 }

 if (sum == num) {

  printf("%d its factor are ", num);

  for (factor = 2; factor <= num / 2; factor++) {

   if (num % factor == 0)

    printf("%d,", factor);

  }//如果因子和等于该数,则求出该数每一个因子并输出

  printf("\n");

 }

}

return 0;

}

10.有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13,...

 

#include<stdio.h>

int main() {

int n;               //该分式的项数

double p = 0, sum = 0, x = 1, y = 2, t = 0;

scanf_s("%d", &n);

for (int i = 1; i <= n; i++) {

 p = y / x;          //该分式每一项的值

 sum += p;           //该分式的和

 t = x;              //存储x的值

 x = y;              //上一项的分子为下一项的分母

 y += t;             //下一项的分子为上一项的分子与分母的和

}

printf("%f", sum);

return 0;

}

11.有一个球从100米高度自由下落,每次落地后又反弹回原来高度的一半,再落下,再反弹,求它在第十次落地时共经历多少米,第十次反弹多高

 

#include<stdio.h>

#include<math.h>

int main() {

double n = 100.0, sum = 100.0, every = 0.0;//sum为小球总经历高度,every为小球每次回弹高度

for (int i = 1; i <= 10; i++) {

 every = pow(0.5, i) * n;       //(1/2)^i*100代表第i次下落回弹的高度

 sum += pow(0.5, i) * n * 2;    //除第一次,其余九次上+下共两次

}

printf("%f %f", sum, every);

return 0;

}

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

 

#include<stdio.h>

int main() {

int n = 1;          //第十天的桃子数

for (int i = 2; i <= 10; i++)

 n = (n + 1) * 2;   //后一天的桃子数+1再乘以2等于前一天的桃子数

printf("%d", n);

return 0;

}

13.用迭代法求x=根号a,求平方根的迭代公式为:

Xn+1=1/2*(Xn+a/Xn):要求前后两次求出的x的差的绝对值小于10^(-5)

 

#include<stdio.h>

#include<math.h>

int main() {

float a, x0, x1;

scanf_s("%f", &a);

x0 = a / 2;    //x0自己赋初值

x1 = (x0 + a / x0) / 2;

do {

 x0 = x1;

 x1 = (x0 + a / x0) / 2; //替换思想

} while (fabs(x0 - x1) >= 1e-5);

printf("sqrt(a)=%f", x1);

return 0;

}

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

2x^3-4x^2+3x-6=0 注:牛顿迭代法公式为:Xn + 1 = Xn - f(n) / f'(n) Xn为输出值,本题为1.5,f(n)=2x^3-4x^2+3x-6,f'(n)=6x^2-8x+3

 

#include<stdio.h>

#include<math.h>

int main() {

double x0, x1, f, f1;

x1 = 1.5;

do {

 x0 = x1;

 f = 2 * pow(x0, 3) - 4 * pow(x0, 2) + 3 * x0 - 6;

 f1 = 6 * pow(x0, 2) - 8 * x0 + 3;

 x1 = x0 - f / f1;

} while (fabs(x1 - x0) >= 1e-5);

printf("方程在1.5附近的根为:%f\n", x1);

return 0;

}

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

 

#include<stdio.h>

#include<math.h>

int main() {

double left = -10.0, right = 10.0, result=1.0, mid=0.0;

while (fabs(result) > 1e-5) {

 mid = (left + right) / 2;

 result = 2 * pow(mid, 3) - 4 * pow(mid, 2) + 3 * mid - 6;

 if (result > 0) right = mid;

 else left = mid;

}

printf("该方程的根为:%f", mid);

return 0;

}//一直在中间找

16.输出以下图形

 

#include<stdio.h>

int main() {

for (int i = 0; i <= 3; i++){

 for (int j = 0; j <= 3 - i; j++)

  printf(" ");

 for (int k = 0; k <= 2*i; k++)     //始于0终于2的倍数,对应*数为奇数

  printf("*");

 printf("\n");

}

for (int i = 0; i <= 2; i++) {

 for (int j = 0; j <= i + 1; j++)

  printf(" ");

 for (int k = 0; k <= 4 - 2 * i; k++)

  printf("*");

 printf("\n");

}

return 0;

}

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

f0f17852cdb84b8c8104488989438a1c.png

结语:本节分享到此结束,欢迎大家指出使用不当的地方!!

相关文章
|
1月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
66 16
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
52 1
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
63 23
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
68 15
|
1月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
61 24
|
2月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
94 10
|
2月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
69 9
|
2月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
62 8

热门文章

最新文章

相关实验场景

更多