• 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
    

    总结:

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

  • 相关阅读:
    远程连接redis服务
    redis的安装以及启动
    Easyui学习之右键菜单easyui-menu
    富文本编辑器KindEditor的使用
    zookeeper启动失败解决方法
    在TortoiseSVN使用clean up
    kettle性能优化
    idea快捷键
    Spring Cloud服务网关 Zuul Filter使用
    添加路由
  • 原文地址:https://www.cnblogs.com/xbhog/p/13848048.html
Copyright © 2020-2023  润新知