练习4-7 求e的近似值 (15 分)
自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
输入格式:
输入第一行中给出非负整数 n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
输入样例:
10
输出样例:
2.71828180
//j应该是double类型的变量,否则再付给sum之前会进行整型的去小数运算
#include <stdio.h>
int main()
{
int n, i;
double sum = 1, j = 1;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
j *= i;
sum += 1 / j;
}
printf("%.8lf", sum);
return 0;
}
习题4-2 求幂级数展开的部分和 (20 分)
已知函数ex可以展开为幂级数1+x+x2/2!+x3/3!+⋯+xk/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求ex的近似值,求和一直继续到最后一项的绝对值小于0.00001。
输入格式:
输入在一行中给出一个实数x∈[0,5]。
输出格式:
在一行中输出满足条件的幂级数部分和,保留小数点后四位。
输入样例:
1.2
输出样例:
3.3201
//1. x的n次幂要用y*=x;来循环表示,不能用x*=x,这样x的值会一直变化。2.要用 j*=i来表示分母,不能用(i*j)这样j一直不会变化;
#include <stdio.h>
int main()
{
double x, y, i = 1, j = 1;
scanf("%lf", &x);
y = x;
double sum = 1 + x;
do{
y *= x;
i++;
j *= i;
sum += y / j;
}while(y / j >= 0.00001);
printf("%.4lf", sum);
return 0;
}
习题4-3 求分数序列前N项和 (15 分)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
//变量需要是double型不能是float型,float型会报错,当N足够大是float的范围可能不够
#include <stdio.h>
int main()
{
int N, i;
double a = 2, b = 1, t;
double sum = 0;
scanf("%d", &N);
for(i = 1; i <= N; i++)
{
sum += a / b;
t = b;
b = a;
a = a + t;
}
printf("%.2lf", sum);
return 0;
}
习题4-4 特殊a串数列求和 (20 分)
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
//理解错误!aa:指的是a十a不是a*a,即当a= 2时,aa = 22;如果是乘法会加“*”的。
#include <stdio.h>
int main()
{
int a, n, i, j = 0, s = 0;
scanf("%d %d", &a, &n);
for(i = 0; i < n; i++)
{
j = j * 10 +a;
s += j;
}
printf("s = %d", s);
return 0;
}
习题4-5 换硬币 (20 分)
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。
输入样例:
13
输出样例:
fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
//理解错误:题中的零钱数额x的单位为分,从输出样例可以看出 2.k的值可由i、j得到,它们之间有关系式 x - i*5 + j * 2 == k;这样可以少写一个for循环
#include <stdio.h>
int main()
{
int x;
int total = 0, count = 0;
int i, j, k;
scanf("%d", &x);
for(i = (x - 2 - 1) / 5; i >= 1 ; i--)
{
for(j = (x - i * 5 - 1) / 2; j >= 1; j--)
{
k = (x - i * 5 - j * 2);
if(i * 5 + j * 2 + k * 1 == x)
{
total = i + j + k;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", i, j, k, total);
total = 0;
count++;
}
}
}
printf("count = %d", count);
return 0;
}
习题4-6 水仙花数 (20 分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
//弄错了变量l和sum的更新位置,不能用N作为while的循环条件,否则只能用一次
#include <stdio.h>
int main()
{
int N, i, j = 0, k, a, b, sum, l;
scanf("%d", &N);
for(i = 0; i < N; i++)
{
j = j * 10 + 9;
}
for(i = (j + 1) / 10; i <= j; i++)
{
k = i;
sum = 0;//
while(k != 0)
{
b = k % 10;
a = 1;
l = N;
while(l != 0)
{
a *= b;
l--;
}
sum += a;
k /= 10;
}
if(sum == i)
printf("%d\n", i);
}
return 0;
}
习题4-7 最大公约数和最小公倍数 (15 分)
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
//1. 忘记了三目运算符的格式:min = (M > N) ? N : M; 2. 最大公约数(从1开始即1也是约数):gcd(greatest common divisor) 最小公倍数(M*N/gcd):lcm(Least common multiple)
#include <stdio.h>
int main()
{
int M, N, i, min, yueshu, beishu;
scanf("%d %d", &M, &N);
min = (M > N) ? N : M;
for(i = 1; i <= min; i++)
{
if(M % i == 0 && N % i == 0)
{
yueshu = i;
}
}
beishu = M * N / yueshu;
printf("%d %d", yueshu, beishu);
return 0;
}
习题4-9 打印菱形图案 (15 分)
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。
输入样例:
7
输出样例:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
//有点麻烦
#include <stdio.h>
int main()
{
int n, i, j, space;
scanf("%d", &n);
for(i = 1; i <= n / 2 + 1; i++)
{
for(space = n / 2 - i + 1; space >= 1; space--)
{
printf(" ");
}
for(j = 1; j <= 2 * i - 1; j++)
printf("* ");
printf("\n");
}
for(i = 1; i <= n / 2; i++)
{
for(space = 1; space <= i; space++)
{
printf(" ");
}
for(j = 2 * (n / 2 - i + 1) - 1; j >= 1; j--)
{
printf("* ");
}
printf("\n");
}
return 0;
}
习题6-7 简单计算器 (20 分)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
//1.不会做。 2.Switch格式忘了
#include <stdio.h>
int main()
{
int n1, n2;
char c;
scanf("%d %c", &n1, &c);
while(c != '=')
{
scanf("%d", &n2);
switch(c)
{
case '+': n1 += n2;break;
case '-': n1 -= n2;break;
case '*': n1 *= n2;break;
case '/':
if(n2 != 0)
{
n1 /= n2;
break;
}
else
printf("ERROR");return 0;
default: printf("ERROR");return 0;
}
scanf("%c", &c);
}
printf("%d", n1);
return 0;
}
今日总结:
题目逐渐变难,要控制好做题时间,一旦超过时间就不要做了,直接看答案。今天做了15道题,效率很低,明天要振作精神了!