韩信点兵--求分数序列前N项和--特殊a串数列求和--猜数字游戏

实验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;
}

发布了54 篇原创文章 · 获赞 0 · 访问量 1006

猜你喜欢

转载自blog.csdn.net/hellobettershero/article/details/103901000