c语⾔程序设计第五版课后答案谭浩强第五章课后答案c语⾔程序设计第五版课后答案谭浩强
1.请画出例5.6中给出的3个程序段的流程图
流程图1:
流程图2:
流程图3:
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,求其最⼤公约数和最⼩公倍数
答案解析:
该题题⽬直接使⽤“辗转相除法”来求解最⼤公约数,以除数和余数反复做除法运算,当余数为 0 时,就取得当前算式除数为最⼤公约数。
最⼤公约数和最⼩公倍数之间的性质:两个⾃然数的乘积等于这两个⾃然数的最⼤公约数和最⼩公倍数的乘积。所以,当我们求出最⼤公约数,就可以很轻松的求出最⼩公倍数。
代码⽰例:
#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.输⼈⼀⾏字符,分别统计出其中英⽂字母、空格、数字和其他字符的个数。
答案解析:
该题可以调⽤getchar函数,从stdin流中读⼊⼀个字符,当输⼊多个字符时,getchar()再执⾏时就会直接从缓冲区中读取了。等同
于getc(stdin)。所以,我们循环调⽤getchar,直到将标准输⼊的内容读到换⾏符\n为⽌。同时判断,读取到的字符是英⽂字母、空格、数字或者其他字符,并计数;
代码⽰例:
#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.求$S_n$=a+aa+aaa+...+$\overbrace{aa+\dots+a}^{n个a}$ 之值,其中a是⼀个数字,n表⽰a的位数,n由键盘输⼊。例如:
2+22+222+2222+22222 (此时n=5)
答案解析:
该题⽬可以将数字拆分为a * 10^n + 前⼀个数字,例如:
2 = 2 * 10^0 + 0 : 默认2的前⼀个数字为0,也就是没有任何值
22 = 2 * 10^1 + 2: 22的前⼀个数字为2
222 = 2*10^2 + 22:222的前⼀个数字为22
以此类推...
所以,在每次循环的时候,需要保存下,上⼀次结果的值,⽅便下⼀次计算
还需要使⽤到C库当中使⽤的pow函数,来计算某个数的n次⽅,我们在该题⽬当中使⽤的是10的n次⽅,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.求$\sum\limits_{n=1}^{20}n!$ (即求1!+2!+3!+4!+...+20!)。
答案解析:
该题需要从1循环到20,依次求出每⼀个数字阶乘的结果。所以在代码当中需要有两个循环,⼤循环从1到20,保证1到20个数字都被循环到,⼩循环⾥计算N阶乘,累加求和。注意:对于20的阶乘已经超出了int类型能过表⽰的数字范围,所以在代码当中使⽤double类型
代码⽰例:
#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);
c语言程序设计教材答案return 0;
}
运⾏截图:
7.$\sum\limits_{k=1}^{100}k$ +$\sum\limits_{k=1}{50}{k}2$ +$\sum\limits_{k=1}^{10}{\frac{1}{k}}$ 。
答案解析:
对于$\sum\limits_{k=1}^{100}k$⽽⾔,指的是求从1到100的和。每个数字为整数,求和也为整数
对于$\sum\limits_{k=1}{50}{k}2$⽽⾔,指的是求从12到502的和。每个数字为整数,求和也为整数。
对于$\sum\limits_{k=1}^{10}{\frac{1}{k}}$⽽⾔,指的是求从$\frac{1}{1}$到$\frac{1}{10}$的和。每个数字不是整数,求和也不是整数。
综上所述:求和结果不是整数,所以定义求和变量是需要定义为带有精度的变量double
该题⽬,最⼤的求和是从从1到100,所以需要⼀个循环,从1遍历到100。针对第⼀种情况,则遍历100次停下来。针对第⼆种情况,则遍历50次的时候停下来,针对第三种情况,则遍历10遍就停下来。
最后,在遍历每⼀个数字的时候,针对三种不同的情况求和。最后将三种不同请求的和加起来就是总体
的和
代码⽰例:
#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。
答案解析:
从题⽬当中得到”⽔仙花数“为⼀个3位数,则范围确定为[100, 999]。另外需要获取该数字的百位数字,⼗位数字,个位数字相加起来等于该数本⾝,则我们需要使⽤到%除的⽅式,来获取每⼀个位权的数字。
代码⽰例:
#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之内的所有完数,并按下⾯格式输出其因⼦:
6 its factors are 1,2,3
答案解析:
因⼦:整数a除以整数b(b≠0) 的商正好是整数⽽没有余数,我们就说b是a的因⼦。整数n除以m,结果是⽆余数的整数,那么我们称m就是n 的因⼦。需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成⽴。因⼦是不包括⾃⾝的
举⼀个例⼦:20 = 4 * 5,则4和5就是20的因⼦,也被称之为因⼦
代码⽰例:
#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项之和。
$\frac{2}{1}$,$\frac{3}{2}$,$\frac{5}{3}$,$\frac{8}{5}$,$\frac{13}{8}$,$\frac{25}{13}$,...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论