实验4-1-5 韩信点兵 (10分)
在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按从1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。
输入格式:
本题无输入
输出格式:
输出韩信至少拥有的士兵人数。
#include<stdio.h>
int main(){
int i;
for(i=0;;i++){
if((i%5==1)&&(i%6==5)&&(i%7==4)&&(i%11==10)){
printf("%d\n",i);
break;
}
}
return 0;
}
用while循环
#include<stdio.h>
int main(){
int i=1;
while(i){
if((i%5==1)&&(i%6==5)&&(i%7==4)&&(i%11==10)){
printf("%d\n",i);
break;
}
i++;
}
return 0;
}
for循环中条件的三种写法
①:省略第一个参数,前提是要在循环前面声明循环变量,如:
int i = 0;
for(;i < 4;i++){}
②:省略第二个参数,意味着此循环进入死循环,除非for循环体内强制退出,如:
for(int i = 0; ; i++){
if(i>4){
break;// return
}
}
③:省略第三个参数,意味着循环进入死循环除非for循环体内强制退出,如:
for(; ; ){ //while(1)
if(i>4){
break;// return
}
}
实验4-1-6 求分数序列前N项和 (15分)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
#include<stdio.h>
int main(){
int i=2;
int j=1;
int n;
int tmp;
float sum=0;
scanf("%d",&n);
while(n){
sum=sum+1.00*i/j;
tmp=i;
i=i+j;
j=tmp;
--n;
printf("%.2f %d %d \n",sum,i,j); //写在这里是为了测试
}
return 0;
}
实验4-1-7 特殊a串数列求和 (20分)
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
#include<stdio.h>
int main(){
int a,n;
int sum=0,item=0;
scanf("%d %d",&a,&n);
if(a>9||n>9)
printf("请输入a,n both小于9的数字");
while(n){
item=10*item+a;
sum=sum+item;
n--;
printf("%d %d\n",sum,item);
}
return 0;
}
输出:
2 3
2 2
24 22
246 222
Program ended with exit code: 0
实验4-1-8 求给定精度的简单交错序列部分和 (15分)
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + … 直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:
#include<stdio.h>
#include<math.h>
int main(){
double eps;
int n=0;
double sum=0;
scanf("%lf",&eps);
while(1/(1.00*(3*n+1))>eps){
//在17次循环结束时,tmp为0.02048,因为++n中返回值是17,但是已经到18次运算,也就是在循环条件里变成了18,计算出的结果是比0.02小的,没有再次进行计算;
//而下面一种方法,没有在循环条件进行计算中进行计算,循环条件中的tmp是第17次计算时的tmp,大于0.02,顺利进入循环体,进行了第18次运算;
sum=sum+pow(-1,n)*(1/(1.00*(3*n+1)));
float tmp=pow(-1,n)*(1/(1.00*(3*n+1)));
n++;
printf("%d)sum=%.6lf tmp=%f\n",n,sum,tmp);
}
return 0;
}
我程序的输出结果(少循环一次)
0.02
1)sum=1.000000 tmp=1.000000
2)sum=0.750000 tmp=-0.250000
3)sum=0.892857 tmp=0.142857
4)sum=0.792857 tmp=-0.100000
5)sum=0.869780 tmp=0.076923
6)sum=0.807280 tmp=-0.062500
7)sum=0.859912 tmp=0.052632
8)sum=0.814457 tmp=-0.045455
9)sum=0.854457 tmp=0.040000
10)sum=0.818743 tmp=-0.035714
11)sum=0.851001 tmp=0.032258
12)sum=0.821589 tmp=-0.029412
13)sum=0.848616 tmp=0.027027
14)sum=0.823616 tmp=-0.025000
15)sum=0.846872 tmp=0.023256
16)sum=0.825133 tmp=-0.021739
17)sum=0.845541 tmp=0.020408
Program ended with exit code: 0
正确的代码:
```c
#include<stdio.h>
#include<math.h>
int main(){
double eps;
int n=0;
double sum=0;
double tmp=1;
scanf("%lf",&eps);
while(fabs(tmp)>eps){ //fabs表示绝对值,
tmp=pow(-1,n)*(1.00/(3*n+1));
sum=sum+tmp;
n++;
printf("%d)sum=%.6lf tmp=%lf\n",n,sum,tmp);
}
return 0;
}
正确的输出结果:
0.02
2):1.000000 1.000000
3):0.750000 -0.250000
4):0.892857 0.142857
5):0.792857 -0.100000
6):0.869780 0.076923
7):0.807280 -0.062500
8):0.859912 0.052632
9):0.814457 -0.045455
10):0.854457 0.040000
11):0.818743 -0.035714
12):0.851001 0.032258
13):0.821589 -0.029412
14):0.848616 0.027027
15):0.823616 -0.025000
16):0.846872 0.023256
17):0.825133 -0.021739
18):0.845541 0.020408
19):0.826310 -0.019231
Program ended with exit code: 0
实验4-1-9 猜数字游戏 (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!
c语言中生成某一范围的随机数
C语言中用rand()函数产生20-90的随机整数
20-90共有71个数字,所以是rand()%71+20 ;
用rand()生成-20-20的随机数
-20-20共有41个数字,所以是rand()%41-20;
需要注意的是,在运行以上代码之前最好设定一下:
srand(time(NULL));//用系统当前时间设置rand()随机序列种子,保证每次运行随机序列不一样
```c
#include<stdio.h>
int main(){
int x,n;
int a;
int i=0;
scanf("%d %d",&x,&n);
while(scanf("%d",&a)){
i++;
printf("第%d次:",i);
if(a==x){
//输入a=x的情况,有第一次对,1-3次对,i到n次对,包括了n次;每次猜对都可以跳出程序;
if(i==1){
printf("Bingo!");
break;
}else if(i<3&&i!=1){
printf("Lucky You!");
break;
}else if(i>3&&i<=n){
printf("Good Guess");
break;
}
}
else if(a!=x&&a>0){
//输入a!=x的情况,有在n次内a>x,在n次a<x,在达到n次前不能跳出程序,因此不能有break,在第n次时需要有break;
if(a>x&&i<n)
printf("Too big");
else if(a<x&&i<n)
printf("Too small!");
else if(i>=n){
printf("次数已到,并不相等Game over\n");
break;
}
}else if(i<=n&&a<0){
//在n次前包括第次时输入的负数,需要有break程序;
printf("输入负数次数已到,Game over\n");
break;
}
}
return 0;
}