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

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

相关文章
|
2月前
|
C语言
C语言程序设计核心详解 第四章&&第五章 选择结构程序设计&&循环结构程序设计
本章节介绍了C语言中的选择结构,包括关系表达式、逻辑表达式及其运算符的优先级,并通过示例详细解释了 `if` 语句的不同形式和 `switch` 语句的使用方法。此外,还概述了循环结构,包括 `while`、`do-while` 和 `for` 循环,并解释了 `break` 和 `continue` 控制语句的功能。最后,提供了两道例题以加深理解。
|
2月前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
2月前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
2月前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
2月前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
13天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
28 6
|
1月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
39 10