练习4-3 求给定精度的简单交错序列部分和 (15 分)
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:
4E-2
输出样例1:
sum = 0.854457
输入样例2:
0.02
输出样例2:
sum = 0.826310
#include "stdio.h"
main()
{
double sum=0.0,sn=1.0,eps,i,flag=-1;
scanf("%lf",&eps);
for(i=1;sn>eps;i++)
{
flag*=-1;//符号转换
sn=1/(i*3-2);//各项绝对值计算
sum+=sn*flag;//求和
}
printf("sum = %lf\n",sum);//输出
}
练习4-6 猜数字游戏 (15 分)
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
#include "stdio.h"
int main()
{
int count=0,a,b,N;
scanf("%d %d", &a, &N);//随机给出被猜数字和最大猜测次数
//开始循环猜测
for(;count<=N;)
{
count++;//次数计数
if(count>N) {printf("Game Over\n");break;}//超过次数退出程序,否则输入猜测数字
scanf("%d",&b);//输入猜测的数字
//判断猜数字情况
if(b<0) { printf("Game Over\n");break; }
else if(b>a) printf("Too big\n");
else if(b<a) printf("Too small\n");
else if(b==a)
{
if(count==1){printf("Bingo!\n");break;}
else if(count<=N){printf("Good Guess!\n");break;}
}
}
return 0;
}
拓展应用:随机数由计算机生成,用户自定义猜游戏次数(难度控制),每次用户输入1个数据,程序给出相对于随机数的大小提示,给出猜数字游戏的结果。
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "time.h"
#include "windows.h"
void win_contr()
{
/*
颜色属性由两个十六进制数字指定, 第一个为背景色, 第二个为前景色。
每个数字可以为下列值之一:
黑色 = 0 蓝色 = 1 绿色 = 2 湖蓝色 = 3
红色 = 4 紫色 = 5 黄色 = 6 白色 = 7
灰色 = 8 淡蓝色=9 淡绿色=A 白色=C
淡紫色=D 淡黄色=E 亮白色=F
*/
//设置背景色为灰色,文字颜色为淡黄色
system("color 47");
//设置窗口大小,cols 宽度 lines 高度
system("mode con cols=30 lines=20");
}
main()
{
win_contr();
int count=0,a,b,i,N;
printf("请输入最大猜游戏次数:");//次数越小难度越大
scanf("%d",&N);//给出最大猜游戏次数
srand((unsigned)time(NULL));//生成时间种子
a=rand()%100+1;//生成1-100随机正整数
//printf("%d %d\n",a,N);//查看生成的随机数和最大猜游戏次数
printf("\nGame begin!\n");//猜游戏开始
printf("\n请输入1-100的正整数!\n\n");//猜游戏开始
for(;count<=N;)
{
count++;//次数计数
if(count>N) //超过次数退出程序,否则输入猜测数字
{
printf("Game Over\n");
printf("The Aanswer is :%d\n\n",a);//查看结果
break;
}
scanf("%d",&b);//输入猜测的数字
//判断猜数字情况
if(b<0) {
printf("Game Over\n");
printf("The Aanswer is :%d\n\n",a);//查看结果
break;}
else if(b>a) printf("Too big\n");
else if(b<a) printf("Too small\n");
else if(b==a)
{
if(count==1){printf("Bingo!\n");break;}
else if(count<=N){printf("Good Guess!\n");break;}
}
}
system("pause\n");
printf("\n\t【】任意键继续\n\t【e】退出\n");
fflush(stdin);
char c=getchar();
//fflush(stdin);
if(c=='e')
return 0;
else
main() ;
}
练习4-7 求e的近似值 (15 分)
自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。本题要求对给定的非负整数n,求该级数的前n项和。
输入格式:
输入第一行中给出非负整数n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
输入样例:
10
输出样例:
2.71828180
#include "stdio.h"
int main()
{
int n,i,j;
double sum=1.0,k; //sum作为求和结果,初值为1.0,k为第j项的阶乘
scanf("%d",&n); //输入数据
printf("\n");
for(i=1;i<=n;i++) //循环求和
{
k=1.0;
for(j=1;j<=i;j++) //循环求阶乘
k=(double)j*k;
//printf("i = %d j = %d k = %.0lf ",i,j,k);//验证阶乘
sum+=1.0/k;
//printf("sum = %.8lf\n",sum);//验证求和
}
printf("%.8lf\n",sum); //输出结果 ,8位小数
}
练习4-10 找出最小值 (20 分)
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:
4 -2 -123 100 0
输出样例:
min = -123
#include "stdio.h"
int main()
{
int i,n,min,a[n];
scanf("%d",&n); //输入数据 n
for(i=0;i<n;i++) //循环输入,存入数组
scanf("%d",&a[i]);
min=a[0]; //假设第一个数值最小
for(i=1;i<n;i++) //循环比较a[i]和 min 将小值赋给min
if(min>a[i]) min=a[i];
printf("min = %d\n",min); //输出结果
}
练习4-11 统计素数并求和 (20 分)
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
#include "stdio.h"
#include "math.h"
int main()
{
int m,n,i,j,count=0,sum=0;
scanf("%d%d",&m,&n); //输入数据 m,n
if(m>n||m<=0||n<=0||n>500) return 0; //判断给出数据是否满足题目要求
else
{
for(i=m;i<=n;i++) //循环 m->n 间所有整数
{
for(j=2;j<=sqrt(i);j++) // 判断是否为素数
if(i%j==0)break; // 满足条件不是素数
if(j>sqrt(i)){count++; sum+=i;} //是素数,计数、求和
}
}
printf("%d %d\n",count,sum); //输出结果
return 0;
}
习题4-1 求奇数和 (15 分)
本题要求计算给定的一系列正整数中奇数的和。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116
#include "stdio.h"
int main()
{
int n,sum=0;
scanf("%d",&n); //输入数据 n
while(n>0) //输入数据大于 0
{
if(n%2) sum+=n; //为奇数 则求和
scanf("%d",&n); //输入下一个数据
}
printf("%d\n",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
#include "stdio.h"
#include "math.h"
int main()
{
int i,j;
double x,eps,sum=1.0,jiecheng;
scanf("%lf",&x); //输入数据 x
eps=x; //输eps作为精度值,初值为 x;
for(i=1;eps>=0.00001;i++)//设置循环,eps<0.00001 时结束
{
jiecheng=1.0; //阶乘初值
for(j=1;j<=i;j++) //计算分母 阶乘
jiecheng*=(double)j;
eps=pow(x,(double)i)/jiecheng; // i次幂用函数pow(x,i)
sum+=eps; //求和
}
printf("%.4lf\n",sum); //输出结果
return 0;
}
习题4-3 求分数序列前N项和 (15 分)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
#include "stdio.h"
int main()
{
int i,x,y,n,t;
double sum=0.0;
scanf("%d",&n); //输入数据 n
for(i=1;i<=n;i++)//设置循环
{
if(i==1){x=2;y=1;} // 计算第 i 项的分子、分母
else {t=x+y;y=x;x=t;}
sum+=(double)x/y; //求和
}
printf("%.2lf\n",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
#include "stdio.h"
int main()
{
int i,a,n;
double sum=0.0,res=0.0;
scanf("%d%d",&a,&n); //输入数据 a,n
for(i=0;i<n;i++)//设置循环
{ sum=sum*10+a; //求每一项
res+=sum; //求和
}
printf("%.0lf\n",res); //输出结果
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
按题目输出(数量从大到小输出)
#include "stdio.h"
int main()
{
int i,j,k,n,count=0;
scanf("%d",&n); //输入数据 n
for(i=n/5;i>0;i--)//设置循环 fen5
for(j=n/2;j>0;j--)//设置循环 fen2
for(k=n;k>0;k--)//设置循环 fen1
if(i*5+j*2+k==n)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k); //输出结果
count++;
}
printf("count = %d\n",count);
return 0;
}
数量从小到大输出
#include "stdio.h"
int main()
{
int i,j,k,n,count=0;
scanf("%d",&n); //输入数据 n
for(i=1;i<=n/5;i++)//设置循环 fen5
for(j=1;j<=n/2;j++)//设置循环 fen2
for(k=1;k<=n;k++)//设置循环 fen1
if(i*5+j*2+k==n)
{
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k); //输出结果
count++;
}
printf("count = %d\n",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
#include "stdio.h"
#include "math.h"
int main()
{
int j,n;
double i,k,m,sum,res;
scanf("%d",&n); //输入数据 n
sum=pow(10,n-1); //N位数 初始值 例 3位数 初值100,肯定不是水仙数
for(i=sum+1;i<sum*10;i++) //N位数 最大值 初值 sum*10-1
{
m=i; //用于求每位数值
res=0.0; //记录每位数字的N次幂的和
for(j=0;j<=n;j++)
{
k=(int)m%10;
m/=10;
res+=pow(k,n);
}
if(i==res)printf("%.0lf\n",i); //满足条件则为水仙数,输出结果
}
return 0;
}
习题4-7 最大公约数和最小公倍数 (15 分)
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
#include "stdio.h"
#include "math.h"
int main()
{
int i,m,n,t,maxg,minb,flag=0;//flag用于确定是否已经取得最大公约数
scanf("%d%d",&m,&n); //输入数据 m,n
t=m>n?n:m; //两数中的小数赋值给 t ,用于确定循环终点
minb=m*n; //假设两数没有公约数,最小公倍数为两数乘积
for(i=t;i>=sqrt(t);i--) //N位数 最大值 初值 sum*10-1 {
if(m%i==0&&n%i==0)
if(flag==0){maxg=i;flag++;} //取得最大公约数后,不再赋值给 maxg
minb/=maxg; //最小公倍数 即为 两数乘积除最大公约数
printf("%d %d\n",maxg,minb); //输出结果
return 0;
}