循环部分习题

1.求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字,请输出所有由它们组成的无重复数字的3位数
输入格式:
输入在一行中给出A
输出格式:
输出满足条件的3位数,要求从小到大,每行6个整数,整数间以空格分隔,但行末不能有多余空格
输入样例:2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 254
423 425 432 435 452 453
523 524 532 534 542 543

int main()
{
    int a;
    scanf("%d",&a);
    int i,j,k;
    int cnt=0;
    i=a;
    while(i<=a+3){
            j=a;
        while(j<=a+3){
            k=a;
            while(k<=a+3){
                if(i!=j){
                    if(i!=k){
                        if(j!=k){
                            cnt++;
                            printf("%d%d%d",i,j,k);
                            //printf("%d",i*100+j*10+k);两种输出选一种
                            if(cnt==6){
                                printf("\n");
                                cnt=0;
                            }else{
                            printf(" ");
                            }
                        }
                    }
                }
                k++;
            }
            j++;
        }
        i++;
    }
    return 0;
}

2.水仙花数
水仙花数是N位的正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身,例如:153=1的三次方+5的三次方+3的三次方
要求编写程序,计算所有N位水仙花数
输入格式:
输入在一行中给出一个正整数N(3<=N<=7).
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行
输入样例:
3
输出样例:
153
370
371

int main()
{
    int n;
    scanf("%d",&n);
    int first=1;//first是最小的n位数,如最小的三位数100
    int i=1;
    //i从0开始走到小于n要走n遍,从1开始走到小于n,要走n-1遍
    //正好需要构建first时,需要乘以(n-1)次10,所以i从1开始
    while(i<n){
            //为了帮忙算出first
        first*=10;
        i++;
    }
    printf("first=%d\n",first);//为了便于观察,可以在这里看一下first的值
    //假设n=3,遍历所有三位数100--999
    i=first;
    while(i<first*10){//i要从first走到first*10
        //此时需要分解这个i,算出它的每一位数,再进行每一位数的n次幂求和
        int t=i;//需要有一个临时变量记录i,因为分解的时候会破坏掉i,所以要记录
        int sum=0;//记录每一位的n次幂累加的结果
    do{
        int d=t%10;//t的最低位
        t/=10;
        int p=1;//保留幂次的结果
        int j=0;//计数变量
        while(j<n){
            //从0到n,循环进行n次
            p*=d;
            //注意p初始值是1,我们需要d的n次幂时,d*d,要乘(n-1)次遍,虽然循环走n遍,但是循环第一遍做的是1*d
            //用p=d,j=1,也可以,循环n-1遍,第一步就是d*d
            j++;
        }
        sum+=p;
    }while(t>0);
    if(sum==i){
        printf("%d\n",i);
    }
        i++;
    }
    return 0;
}

3.打印九九乘法口诀表
本题要求对任意给定的1位正整数N,输出从11到NN的部分口诀表
输入格式:
输入在一行中给出一个正整数N(1<=N<=9)
输出格式:
输出下三角N*N部分口诀表,其中等号右边占4位,左对齐

int main()
{
    int n;
    scanf("%d",&n);
    int i,j;//j是第一个数字,i是第二个数字,j是行
    i=1;
    while(i<=n){
            j=1;
    while(j<=i){
            printf("%d*%d=%d",j,i,i*j);
    if(i*j<10){
        printf("   ");//三个空格
    }else{
        printf("  ");//两个空格
    }
        j++;
    }
        printf("\n");
        i++;
    }
    return 0;
}

4.统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和
输入格式:
输入在一行中给出2个正整数M和N(1<=M<=N<=500)
输出格式:
在一行中顺序输出M和N区间内素数的个数,以及它们的和,数字间以空格分隔
输入样例:
10 31
输出样例;
7 143

int main()
{
    int m,n;
    int i;
    int cnt=0;//需要统计个数,所以要有计数器
    int sum=0;

    scanf("%d %d",&m,&n);
    if(m==1){
            //首先 1不是素数
            //若没有这一段程序,若测试用例中m等于1,则i等于1,则下方k=2,k<i-1,不成立,
            //此时isprime值为1,将会判断出1是素数

        m=2;//如m值为1,不防让m=2,从2开始判断,因为反正1不是素数,要被拿走
    }
    for(i=m;i<=n;i++){//循环从m走到n
        int isPrime=1;
        int k;
        for(k=2;k<i;k++){
            if(i%k==0){//不是素数
                isPrime=0;
                break;
            }
        }
        //判断i是不是素数
        if(isPrime){
            cnt++;
            sum+=i;
        }
    }
    printf("cnt=%d,sum=%d\n",cnt,sum);
    return 0;
}

5.猜数字游戏
和之前所写的猜数字游戏不同,此题是由人产生随机数,计算机来猜数字

猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,
需要你编写程序,自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),
相等表示猜到了,如果猜到,则结束程序。程序还要求统计猜的次数
如果1次猜出该数,提示"Bingo!";
如果3次以内猜到该数,则提示"Lucky you!";
如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示”Good Guess!"
如果超过N次都没猜到,则提示"Game Over",并结束程序
如果在到达N次之前,用户输入了一个负数,也输出"Game Over",并结束程序。
输入格式:
输入第一行中给出2个不超过100的正整数,分别是系统产生的随机数
以及猜测的最大次数N,随后每行给出一个用户的输入,直到出现负数为止
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或"Game Over"则结束
输入样例:
58 4
70
50
56
58
60
-2

int main()
{
    int number,n;//用户给的数字和可猜测的次数
    int inp;//计算机每次所猜的数字
    int finished=0;//用于控制循环要不要退出的
    int cnt=0;//记录猜测次数
    scanf("%d %d",&number,&n);
    do{
        scanf("%d",&inp);
        cnt++;
        if(inp<0){
            printf("Game Over\n");
            finished=1;
        }else if(inp>number){
            printf("Too Big\n");
        }else if(inp<number){
            printf("Too Small\n");
        }else{
            if(cnt==1){
            printf("Bingo!\n");
            }else if(cnt<=3){
            printf("Lucky you!\n");
            }else{
                printf("Good Guess!\n");
            }
            finished=1;
    }
    if(cnt==n){//如果输入次数与给定次数已经相等了
        if(!finished){//并且还没有finished
            printf("Game Over!\n");
            finished=1;
        }
    }
}while(!finished);
return 0;
}

6.求序列前N项和
本题要求编写程序,计算序列2/1+3/2+5/3+8/5+……的前N项之和,
注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子
输入格式:
输入在一行中给出一个正整数N
输出格式:
在一行中输出部分和的值,精确到小数点后2位,题目保证计算结果不超过双精度范围
输入样例;
20
输出样例:
32.66

int main()
{
   int n;
   double dividend,divisor;//分子,分母,
   //当给的n较大时,虽然相除所得得数也许较小,但分子分母已经很大,考虑超出int表达界限,因此用了double型
   double sum=0.0;
   int i;
   double t;//t类型要与分子相同
   scanf("%d",&n);
   dividend=2;
   divisor=1;
   for(i=1;i<=n;i++){
    sum+=dividend/divisor;
    t=dividend;
    dividend=dividend+divisor;
    divisor=t;
   }
   printf("%.2f\n",sum);
return 0;
}

7.约分最简分式
分数可以表示为(分子/分母)的形式。
编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。
最简分式是指分子和分母不具有可以约分的成分了。如6/12被约分为1/2.
当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8
而当分子分母相等时,仍然表达为1/1的分数形式
输入格式:
输入在一行中给出一个分数
输出格式:
格式与输入相同,为这个分数的最简分式
提示:在scanf的格式字符串中加入"/",让scanf来处理这个斜杠
输入样例:
60/120
输出样例:
1/2

int main()
{
  int dividend,divisor;
  scanf("%d/%d",&dividend,&divisor);

  int a=dividend;//保存分子分母,不然在计算过程中它们会被消耗掉
  int b=divisor;
  int t;
  while(b>0){//算出a是最大公约数
    t=a%b;
    a=b;
    b=t;
  }
  printf("%d/%d\n",dividend/a,divisor/a);
return 0;
}

8.念数字
输入一个整数,输出每个数字对应的拼音,当整数为负数时,先输出"fu"字,

输入格式:
输入在一行中给出一个整数,如1234
提示整数包括负数、零和正数
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格,如:yi er san si。
输入样例
-600
输出样例:
fu liu ling ling

int main()
{
  int x;
  scanf("%d",&x);
  if(x<0){
    printf("fu");
    x=-x;//翻过来变成正的,下面就一样去处理
  }
  int mask=1;
  int t=x;
  while(t>9){//第一个循环来求出mask
    t/=10;
    mask*=10;
  }
  do{
    int d=x/mask;//第二个循环用mask把整数从最高位分解到最低位
    switch(d){
        case 0:printf("ling");break;
        case 1:printf("yi");break;
        case 2:printf("er");break;
        case 3:printf("san");break;
        case 4:printf("si");break;
        case 5:printf("wu");break;
        case 6:printf("liu");break;
        case 7:printf("qi");break;
        case 8:printf("ba");break;
        case 9:printf("jiu");break;
    }
    if(mask>9) printf(" ");//若mask>9,意味着后面还可以再分解,即不是最后一位,所以加空格
    x%=mask;
    mask/=10;
  }while(mask>0);
  printf("\n");
return 0;
}

9.求a的连续和
输入两个整数a和n,a的范围是[0,9],n的范围是[1,8],求数列之和S=a+aa+aaa+……+aaaa……a(n个a),
如a为2,n为8时输出的是2+22+222+……+22222222的和

输入格式:
输入在一行中给出两个整数,先后表示a和n
输出格式:
在一行中输出要求的数列之和

输入样例:
2 4
输出样例:
2468

int main()
{
  int a,n;
  scanf("%d %d",&a,&n);

  int sum=0;
  int i;
  //2  2*10+2  (2*10+2)*10+2
  int t=0;//每一轮是新的数字,如第一轮是2,第二轮是22,第三轮是222,用来表达每一轮的数字
  for(i=0;i<n;i++){
    t=t*10+a;
    sum+=t;
  }
  printf("%d\n",sum);
return 0;
}
发布了33 篇原创文章 · 获赞 0 · 访问量 169

猜你喜欢

转载自blog.csdn.net/weixin_45087108/article/details/104469956
今日推荐