选择循环

例一 高速公路超速处罚 
 

按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。

输入格式:

输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。

输出格式:

在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。

输入样例1:

65 60
 

输出样例1:

OK
 

输入样例2:

110 100
 

输出样例2:

Exceed 10%. Ticket 200
 

输入样例3:

200 120
 

输出样例3:

Exceed 67%. License Revoked
 1 #include<stdio.h>
 2 int main(void)
 3 {
 4   int speed,limit;
 5   double per; 
 6   scanf("%d%d",&speed,&limit);
 7   per=(speed-limit)*100.0/limit;
 8   if(per>=10&&per<50)
 9   {
10       
11     printf("Exceed %.lf%%. Ticket 200",per);
12   }
13   else if(per>=50)
14   {
15     printf("Exceed %.lf%%. License Revoked",per);
16   }
17   else
18     printf("OK");
19 }
错误代码:
1
#include<stdio.h> 2 int main(void) 3 { 4 int speed,limit,x; 5 scanf("%d%d",&speed,&limit); 6 if(speed>=limit+limit*0.1&&speed<limit+limit*0.5) 7 { 8 x=100*fabs(limit-speed)/limit; 9 printf("Exceed %d%%. Ticket 200",x); 10 } 11 else if(speed>=limit+limit*0.5) 12 { 13 x=100*fabs(limit-speed)/limit; 14 printf("Exceed %d%%. License Revoked",x); 15 } 16 else 17 printf("OK"); 18 }
总结:主要错误就是没注意题目说的超出的百分之多少用double,不然用整形偏差太大,如13%很容易
漏掉,注意什么时候用double,什么时候用int及其它。
例二  求一元二次方程的根 
 

本题目要求一元二次方程的根,结果保留2位小数。

输入格式:

输入在一行中给出3个浮点系数a、b、c,中间用空格分开。

输出格式:

根据系数情况,输出不同结果:

1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;

2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;

3)如果方程只有一个根,则直接输出此根;

4)如果系数都为0,则输出"Zero Equation";

5)如果a和b为0,c不为0,则输出"Not An Equation"。

输入样例1:

2.1 8.9 3.5
 

输出样例1:

-0.44
-3.80
 

输入样例2:

1 2 3
 

输出样例2:

-1.00+1.41i
-1.00-1.41i
 

输入样例3:

0 2 4
 

输出样例3:

-2.00
 

输入样例4:

0 0 0
 

输出样例4:

Zero Equation
 

输入样例5:

0 0 1
 

输出样例5:

Not An Equation
 1 #include<stdio.h>
 2 #include <math.h>
 3 int main(void)
 4 {
 5   double a,b,c,root,x1,x2;
 6   scanf("%lf%lf%lf",&a,&b,&c);
 7   if(a==0&&b==0&&c==0)
 8   {
 9       printf("Zero Equation");
10   }
11   else if(a==0&&b==0&&c!=0)
12   {
13   printf("Not An Equation");
14   }
15   else if(a==0)
16   {
17       printf("%.2f\n",-c / b);
18   }
19   else
20   {
21     root=b*b-4*a*c;
22   x1=(-b+sqrt(root))/(2*a),x2=(-b-sqrt(root))/(2*a);
23        if(root>0)
24   {
25       printf("%.2lf\n",x1);
26       printf("%.2lf\n",x2);
27   }
28   else if(root<0)
29   {
30       printf("%.2f+%.2fi\n%.2f-%.2fi\n",(b == 0 ? b : -b) / (2*a),sqrt(-root) / (2*a),(b == 0 ? b : -b) / (2*a),sqrt(-root) / (2*a));
31   }
32   else if(root==0)
33   {
34       printf("%.2lf",-b/(2*a));
35   }
36   }
37 }
注意:这里的?:新内容。
 
例三 龟兔赛跑 
 

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:

242
 

输出样例:

@_@ 726
 
#include<stdio.h>
int main(void)
{
    int T;
    scanf("%d",&T);
    int time,time1;
    int sr=0,st=0;
    int flag=0;
    for(time=1;time<=T;time++)
    {
        time1=0;
        st=st+3;
        if(flag==0)
        {
            sr=sr+9;
        }
        if(time%10==0)
        {
            if(sr>st)
            {
                while(time1<30&&time1+time<T)
                {
                    st=st+3;
                    time1++;
                }
                time=time+time1;
            }
        }
    }
    if(sr>st)
    printf("^_^ %d",sr);
    else if(st>sr)
    printf("@_@ %d",st);
    else
    printf("-_- %d",st);
}
总结:就是一步一步来1:构造循环体2:把相关数据输入st,sr等3:‘过了十分钟后’的结果
4:输出数据
错误代码:
#include<stdio.h> int main(void)
{ int vt=3,vr=9,time; int i=10,sr=0,st=0; scanf("%d",&time); while(i<time) { sr=sr+vr*10,st=st+vt*10; if(sr>st) { st=st+vt*30; i=i+30; } if(i<time) i=i+10; else { st=st-vt*30; i=i-20; break; } } st=st+vt*(time-i); sr=sr+sr*(time-i); if(sr>st) printf("^_^ %d",sr); else if(st>sr) printf("@_@ %d",st); else printf("-_- %d",st); }
总结:1:不应该用乘10来循环,循环一般都为i++;2:以及分不清while与for什么时候用,这里明显是for;i=1;i<t;i++
的结构。3:不懂‘过了十分钟后’怎么写代码。

例四 找完数
 

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30
 

输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
#include<stdio.h>
int main() 
{
    int n,i,j,m,sum,c=0;//c统计完数个数
    scanf("%d %d",&n,&m);
    for(i=n; i<=m; i++) 
    {
        sum=1;
        for(j=2; j<i; j++) 
        {
            if(i%j==0) 
            {
                sum=sum+j;
            }
        }
        if(sum==i) 
        {
            c++;
            printf("%d = 1",sum);
            for(j=2; j<i; j++) 
            {
                if(i%j==0) 
                {
                    printf(" + %d",j);

                }
            }
            printf("\n");
        }
    }
    if(c==0)
        printf("None");
    return 0;
}
总结:自己多练练,实则不难。
 
例五 水仙花数
 

水仙花数是指一个N位正整数(N3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13​​+53​​+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3<=N<=7)

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3
 

输出样例:

153
370
371
407
#include<stdio.h>
int pow(int a,int b)//注意pow超时问题
{
    int sum = 1;
    while(b)
    {
        sum *= a;
        b--;
    }
    return sum;
}
int main(void) 
{
    int N,i,j,result=0,sum;
    scanf("%d",&N);
    int min,max;
    min=pow(10,N-1),max=pow(10,N);
    for(i=min;i<max;i++) 
    {
        for(j=i;j>0;j=j/10) 
        {
            sum=j%10;
            result=pow(sum,N)+result;
            
        }
        if(result==i)
        {
            printf("%d\n",i);
        }
        result=0;
    }
}

 
原文地址:https://www.cnblogs.com/FettersLove/p/12863497.html