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