C语言程序设计之 循环控制2020-10-20

2020-10-20 整理:

第一题:

2011年开始实行新个人所得税法,要求输入月薪salary,输出应交的个人所得税 tax (保留两位小数)。

新税法方案如下:
tax=rate*(salary-3500) - deduction
当 salary<=3500时,rate=0、deduction=0;
当 3500<salary<=5000时,rate=3%、deduction=0;
当 5000<salary<=8000时,rate=10%、deduction=105;
当 8000<salary<=12500时,rate=20% 、deduction=555;
当 12500<salary<=38500时, rate=25% 、deduction=1005;
当 38500<salary<=58500时, rate=30% 、deduction=2755;
当 58500<salary<=83500时, rate=35% 、deduction=5505;
当 83500<salary时, rate=45% 、deduction=13505;

【输入输出样例1】(下划线部分表示输入)

Enter the salary: 5010.87
tax=46.09

【输入输出样例2】(下划线部分表示输入)

Enter the salary: 32098.76
tax=6144.09

【输入输出样例3】(下划线部分表示输入)

Enter the salary: 3000
tax=0.00

【输入输出样例4】(下划线部分表示输入)Enter the salary: 59000
tax=13920.00

【输入输出样例5】(下划线部分表示输入)Enter the salary: 84500
tax=22945.00

【样例说明】

输入提示符后要加一个空格。例如“ Enter the salary : ”,其中“:”后要加一个且只能一个空格。

输出语句的“=”两边无空格。

英文字母区分大小写。必须严格按样例输入输出。

#include <stdio.h>

void getTax(double salary,double rate,int deductio);
int main() {
//    double salary;
//    scanf("%lf",&salary);
//    printf("%lf",(double )(salary-30));

    double salary;
    double tax,rate;
    int deduction;
    printf("Enter the salary: ");
    scanf("%lf",&salary);
    if (salary<=3500){
        getTax(salary=3500,0,0);
    } else if (salary<=5000) {
        getTax(salary, 0.03, 0);
    }else if (salary<=8000) {
        getTax(salary, 0.1, 105);
    }else if (salary<=12500) {
        getTax(salary, 0.2, 555);
    }else if (salary<=38500) {
        getTax(salary, 0.25, 1005);
    }else if (salary<=58500) {
        getTax(salary, 0.3, 2755);
    }else if (salary<=83500) {
        getTax(salary, 0.35, 5505);
    }else{
        getTax(salary, 0.45, 13505);
    }

    return 0;
}

void getTax(double salary,double rate,int deduction){
    double tax;
    tax =(rate*(salary-3500)-deduction);
    printf("tax=%.2lf",tax);

}

解释

上面代码段使用的基础的if-else if-else结构,但是使用的时候注意if else if eles各使用范围,不要出现多余代码,影响系统运行速度。

第二题:(同构数)

【问题描述】

同构数是其平方数的尾数等于该数自身的自然数,例如:25×25=625。从键盘输入一个不大于10000的自然数,判断其是否是同构数并按样例格式输出。

【输入形式】

从键盘输入一个不大于10000的自然数。

【输出形式】

输出格式按样例。

【样例输入1】

25

【样例输出1】

25 yes,25*25=625

【样例输入2】

11

【样例输出2】

11 no,11*11=121

#include <stdio.h>
#include<math.h>
int main() {
    int x,y,z;
    scanf("%d",&x);
    int i =0;
    z = x;
    //获取幂
    while (x !=0){
        x = x/10;
        i++;
    }
    //pow a几次幂
    y = pow(10,i);
    //乘积取后i位的数
    if(z == z*z%y){
        printf("%d Yes,%d*%d=%d",z,z,z,z*z);
    } else{
        printf("%d No,%d*%d=%d",z,z,z,z*z);

    }
    return 0;

}

解释:

首先我们需要要知道怎么获得后几位数字,使用%10^n获取乘积的后几位;

In [2]: 625%100
Out[2]: 25

In [3]: 6987%1000
Out[3]: 987

但是我们怎么知道应该除以n的多少呢;

我们可以循环整除,使得x=0(x我们输入的数字),若x !=0---->i++即:

int i =0;
while (x !=0){
    x = x/10;
    i++;
}

这样我们就获得了n值。

后面只需要把原参数与乘积取余后i位的数做对比即可。

第三题:(加一天后日期)

问题描述】输入一个日期,显示这个日期加一天后的日期。注意要考虑这个日期是年尾或各个月的月尾的情况。

【输入形式】输入一个日期,年月日形式表示,空格分开。
【输出形式】 输出一个日期,年月日形式表示,空格分开。

【样例输入】2000 12 31

【样例输出】2001 1 1

#include <stdio.h>

int main() {
    int year,month,days;
    scanf("%d %d %d",&year,&month,&days);
//    printf("%d %d %d",year,month,days);

    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            if(month ==12 && days==31){
                printf("%d %d %d",year+1,1,1);
            } else{
                if(days ==31){
                    printf("%d %d %d",year,month+1,1);
                } else{
                    printf("%d %d %d",year,month,days+1);
                }
            }
            break;
        case 4:
        case 6:
        case 9:
            if(days ==30){
                printf("%d %d %d",year,month+1,1);
            } else{
                printf("%d %d %d",year,month,days+1);
            }
            break;
        case 2:
            if(year%400 ==0 || year%4==0 && year%100 !=0){
                if(days==29){
                    printf("%d %d %d",year,month+1,1);
                } else{
                    printf("%d %d %d",year,month,days+1);
                }
            } else{
                if(days==28){
                    printf("%d %d %d",year,month+1,1);
                } else{
                    printf("%d %d %d",year,month,days+1);
                }
            }
    }
    return 0;
}

解释:

首先需要明确每个月份包含的天数,即:

1 3 5 7 8 10 12包含31天,且31需要特殊处理,即31+1--->1;其中如果月份等于12,需要特殊处理,即years+1,1,1;

4 6 9包含30天,且30需要特殊处理,即30+1--->1;

2月需要判断是否为闰年:如果是闰年则包含29天,且29需要特殊处理,即29+1--->1;

如果不是则包含28天,且28需要特殊处理,即28+1--->1;

如果其他条件则,years、month、dayas+1;

分析完成,后面使用if-else即可。

第四题:(零钱换整钱)

问题描述】

某人拿了一堆硬币去银行换钱,已知1角的硬币厚1.8mm,5角的硬币厚1.5mm,1元的硬币厚2.0mm。他将1角的硬币放成一叠,将5角的硬币放成一叠,将1元的硬币放成一叠,发现3叠硬币一样高。银行正好把这些硬币换成若干张面值为10元的纸币,问此人至少带了多少钱的硬币(元为单位),每种面值的硬币各有多少枚。输出格式为:1角的枚数,5角的枚数,1元的枚数,总金额元数(样如:50,30,40,60)。

【输入形式】

无输入。

【输出形式】

输出如下用逗号分隔的4个数(样如:50,30,40,60):

1角的枚数,5角的枚数,1元的枚数,总金额元数

#include <stdio.h>
int main(){
//    int x,y,z;
//    1.8*x=1.5*y=2.0*z;

    for (int x = 1; x <=100; x++) {
        for (int y = 1; y <= 100; y++) {
            for (int z = 1; z <= 100; z++) {
                int result = 0.1*x+0.5*y+z;
                    if(result%10==0&&1.8*x==1.5*y&&1.5*y==2.0*z){
                        printf("%d,%d,%d,%d",x,y,z,result);
                    }


            }
        }
    }
    return 0;
}

解释:

首先此题属于穷举范围,个人只写出一个版本,网站各版本都有,自行学习;

由题意可以得出一个等式:1.8x=1.5y=2.0*z,假设1角的数量 x, 依次 y , z;

并且result = 0.1x+0.5y+z,result的结果取余应该等于0;

假设每个硬币的数量上限为100,若没有数据或者多组数据,则相应的范围增加或减少,结果只能唯一;

满足上述条件即可。

运行成功:

50,60,45,80

总结:

上述题目的解不是唯一,例题中的解是我所理解并运行成功的,如果有不对的地方,欢迎指出。

posted @ 2020-10-20 18:16  Xbhog  阅读(679)  评论(0编辑  收藏  举报