C语言编程入门—while循环 摘选(week5)

第五周来喽~(第四周没写)


在写题目之前,先为大家整理了几个经典循环:

一、以  输入指定数作为结束  的循环。

eg,输入若干个数,直至遇到输入 -1 结束

1)灵活运用 , 符号,顺序从左到右

while(scanf("%d",&n),n!=-1)

2)灵活 运用 &&

while(scanf("%d",&n)&&n!=-1)

 二、以 输入指定个数作为结束 的循环。

eg,先输入n,在输入n个数字

1)通过for循环实现(执行n次),不会改变n的值

for (int i=0; i < n;i++)

2)通过while循环实现(执行n次),当n最后变成0时循环结束,坏处就是会改变n的值

while(n--)

三、 不定项输入(了解一下)

 感兴趣的可以再去深入了解一下~

while(scanf("%d",&n)!=EOF)
while(~scanf("%d",&n))

问题 B: 求最大值(一) ---- 不固定次数循环【while if】

题目描述

从键盘输入n(n>0)个正整数,找到其中的最大值 提示: 假设最大值为-1 以后输入一个与最大值比较,如果比最大值大,则更新最大值为该输入数据 所有数据输入结束 就可以输出最大值

提示:

使用标记型循环结果:

 scanf("%d",&s);

while(s!=标记值)

{

           ……        /* 你需要处理的问题 */

     scanf("%d",&s);

}

循环中要处理的问题

   if 输入的s大于最大值max

         则更新max的值为s的值

 输入

从键盘输入一系列数据,以-1作为输入结束标志

 输出

输出其中的最大值

样例输入

1 2 3 4 5 6 7 8 9 -1

样例输出 

9

 问题分析 

逐个输入,逐个比较,详见代码(简写版):

#include <stdio.h>
int main()
{
    int n, max = -1;
    while(scanf("%d",&n),n!=-1)
        if(n>max)  max = n;
    printf("%d", max);
}

问题 C: 确定数值长度(4.1-4) (----while 循环)

题目描述

任意输入一个整数n(n在1..100000000),统计该数是几位数 提示: 用除10运算 如:123  , (1) 123/10=12 重复以上步骤,直至该数变为0为止

 输入

任意输入一个整数n(n在1..100000000)

 输出

输出该数的数码位数

样例输入

13456

样例输出 

5

 问题分析 

#include <stdio.h>
int main(void)
{
    int n,i=0;
    scanf("%d", &n);
    while(n)
        n /= 10, i++;
    printf("%d\n", i);
}

问题 G: (6)*求任意整数各数码之和(二)(4.1-5)(--while 循环)

题目描述

输入任意一整数,求该整数各位数码之和

 输入

输入一整数n (其中n >=0,n <=100000000)

 输出

输出各位数码之和

样例输入

13579

样例输出 

9+7+5+3+1=25

 问题分析 

主要注意格式问题,我把个位数提出来单独书写,所以 sum 后面还要再 +n%10

#include <stdio.h>
int main(void)
{
    int n,sum=0;
    scanf("%d", &n);
    while(n>10)
        printf("%d+", n % 10), sum += n%10,n /= 10;
    printf("%d=%d", n%10,sum+n%10);
}

问题 H: 【C语言】【循环while】勤劳的蚂蚁

题目描述

有两只勤劳的蚂蚁在准备食物,为了自我激励一下,它们打算开展比赛,看谁在一段时间内准备的食物多一些。你能帮忙做个裁判吗,来统计一下哪只蚂蚁准备得更加多一些?

循环中要处理的问题

   if 输入的s大于最大值max

         则更新max的值为s的值

 输入

输入有若干行,每行2个数字,第一个整数表示蚂蚁(1表示1号蚂蚁,2表示2号蚂蚁,不会出现其他数字)。第二个整数表示该蚂蚁带回的食物数量,假设该数据都在合法范围内。

当输入两个数字都为0(即0 0)时表示输入结束

 输出

输出拖回食物多的蚂蚁的编号和食物总数量。如果相同,输出“equal”(输出不包含双引号)。输出后换行。

样例输入

1 2 2 9 1 7 2 6 1 1 2 0 1 2 2 11 0 0

样例输出 

2 26

 问题分析 

#include<stdio.h>
int main()
{
    int sum1,sum2;//sum1表示蚂蚁1,sum2表示蚂蚁2
    int n, food;
    sum1 = sum2 = 0;
    while(scanf("%d %d",&n,&food),n!=0||food!=0)//遇到n和food同时为0停止
    {
        if(n==1)
            sum1 += food;
        else
            sum2 += food;
    }
    if(sum1>sum2)
        printf("%d %d", 1,sum1);
    else if(sum1<sum2)
        printf("%d %d", 2,sum2);
    else
        printf("equal\n");
    
}

问题 I: 【C语言】黑洞数【while】

题目描述

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)

例如,对三位数207:

  • 第1次重排求差得:720 - 27 = 693;
  • 第2次重排求差得:963 - 369 = 594;
  • 第3次重排求差得:954 - 459 = 495;

以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。

任意输入一个三位数,编程给出重排求差的过程。

 输入

输入在一行中给出一个三位数。

 输出

按照以下格式输出重排求差的过程:

序号: 数字重排后的最大数 - 重排后的最小数 = 差值 

序号从1开始,直到495出现在等号右边为止

样例输入

123

样例输出 

1: 321 - 123 = 198

2: 981 - 189 = 792

3: 972 - 279 = 693

4: 963 - 369 = 594

5: 954 - 459 = 495

 问题分析 

#include<stdio.h>
int main()
{
    int n,i=1,result=0;//初始化result,不为495即可
    scanf("%d", &n);
    while(result!=495)
    {
        int max, min;
        int a, b, c, t;
        a=n/100;b=n/10%10;c=n%10; //分解为a,b,c三个数 
        if(a<b) {t=a;a=b;b=t;}   //三个if是把a,b,c从大到小排序 
        if(a<c) {t=a;a=c;c=t;}
        if(b<c) {t=b;b=c;c=t;}
        max=a*100+b*10+c; min=a+b*10+c*100;
        result = max - min;
        printf("%d: %d - %d = %d\n", i, max, min, result);
        n = result;
        i++;
    }
}

问题 J: 【C语言】整数的分类处理【while/for-switch】

题目描述

给定 N 个正整数,要求你从中得到下列三种计算结果: A1 = 能被 3 整除的最大整数 A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数 A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)

 输入

输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。

 输出

在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE。

样例输入

8

5 8 7 6 9 1 3 10

样例输出 

9 3 6.5

 问题分析 

此处没有讨论A1、A2、A3不存在的情况,运行也是正确的,如果想严谨一些,可以再自行加一些判断语句。主要理解 3K、3K+1、3K+2 如何翻译成代码形式

想看严谨版本的可以看week6的   大差不差

#include<stdio.h>
int main()
{
    int A1,A2,t,i=0;//初始化result,不为495即可
    float A3;
    A1=A2 = A3 = 0;
    scanf("%d", &t);
    while(t--)
    {
        int n;
        scanf("%d", &n);
        if(n%3==0&&n>A1) A1=n;
        if(n%3==1) A2++;
        if(n%3==2) { A3+=n;  i++;}
    }
    printf("%d %d %.1f\n", A1, A2, A3/i);
}

希望大家可以早日消化好循环~

猜你喜欢

转载自blog.csdn.net/qq_63761366/article/details/127311057