1.
略
2.请补充例5.7程序,分别统计当“fabs(t)>=1e-6”和“fabs(t)>=1e-8”时执行循环体的次数。
解题思路:
设置一个整型变量count,初值为0;循环体每执行一次后,count的值加一。
(1)当”fabs(t)=1e-6“时
代码:
#include<stdio.h>
#include<math.h>
int main() {
int count = 0; //count用来记录循环体执行的次数
int sign = 1; //sign用来表示数值的符号
double pi = 0.0, n = 1.0, term = 1.0; //n代表分母,term代表当前项的值
while (fabs(term) > 1e-6) {
pi = pi + term;
n = n + 2;
sign *= -1;
term = sign / n;
count++;
}
pi *= 4;
printf("pi=%10.8f\n", pi);
printf("循环体执行了%d次\n", count);
return 0;
}
运行结果:
(2)当”fabs(t)=1e-8“时
运行结果:
3.输入两个正整数m和n,求其最大公约数和最小公倍数。
解题思路:
最大公约数:利用辗转相除法(以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数)
例如求2344和766的最大公约数,过程如下:
2344/766=3---余46
766/46=16---余30
46/30=1---余16
30/16=1---余14
16/14=1---余2
14/2=7---余0
当余数为0时,除数为2,因此2344和766的最大公约数为2.
最小公倍数:利用公式法(两个数的乘积 等于 两个数最大公约数和最小公倍数的乘积),最小公倍数等于两个数的乘积除以两个数的最大公约数。
代码:
#include<stdio.h>
int main() {
int m, n, t, mul, ret; //mul记录两个数的乘积,ret记录余数
printf("请输入两个正整数:");
scanf_s("%d%d", &m, &n);
//保证m大于
mul= m * n;
if (m < n) {
t = m;
m = n;
n = t;
}
//
while (ret = m % n) { //若余数不为0,执行循环体内容;
m = n;
n = ret;
}
printf("最大公约数为:%d\n最小公倍数为:%d\n", n, mul / n);
return 0;
}
运行结果:
4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
解题思路:
用while循环和 getchar()函数,每次从键盘读入一个字符,直到读入'\n'为止;读入字符后,依次判断其是否为字母、空格、数字、其他,若是,则相应记录加一。
代码:
#include<stdio.h>
int main() {
char c;
int n1=0, n2=0, n3=0, n4=0; //n1记录英文字母个数;n2记录空格个数;n3记录数字个数;n4记录其他字符个数
while ((c = getchar()) != '\n') {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
n1++;
else if (c == ' ')
n2++;
else if (c >= '1' && c <= '9')
n3++;
else
n4++;
}
printf("英文字母个数为:%d\n", n1);
printf("空格个数为:%d\n", n2);
printf("空格个数为:%d\n", n3);
printf("其他字符个数为:%d\n", n4);
return 0;
}
运行结果:
5.求Sn=a+aa+aaa+...+aa...a之值,其中a是一个数字,n代表a的位数,例如:2+22+222+2222+22222(此时n=5)
解题思路:
Sn由n项相加组成,因此考虑由循环;假设a=2,n=5,分析各项组成可得如下规律: