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
總結:
上述題目的解不是唯一,例題中的解是我所理解並運行成功的,如果有不對的地方,歡迎指出。