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