题目一
输入一个最高为五位的数字。
- 判断为几位数
- 按顺序逐个输出
- 逆序输出
判断为几位数
错误记录
#include <stdio.h>
int main()
{
int a;
printf("enter a number:");
scanf("%d",&a);
switch(a)
{
case'a<10':printf("一位数");break;
case'a<100':printf("为两位数");break;
case'a<1000':printf("为三位数");break;
case'a<10000':printf("为四位数");break;
case'a<100000':printf("为五位数");break;
}
return 0;
}
- 原因:switch中case公式为 case 常量:语句;这里的常量用了表达式;
- 解决思路,用整型除法特征先计算位数
If语句版本
#include <stdio.h>
int main()
{
int a;
printf("enter a number:");
scanf("%d",&a);
if(a<10)
{
printf("为一位数");
}
else if(a<100)
{
printf("为两位数");
}
else if(a<1000)
{
printf("为三位数");
}
else if(a<10000)
{
printf("为四位数");
}
else if(a<100000)
{
printf("为五位数");
}
return 0;
}
按顺序逐个输出
开始想出来的是逆序运算,后面想到可以魔改做到顺序逐个输出
逆序输出
思路
就是把输入的数字处以10得到余数,比如1899%10=9=y,然后输出了个位数9
循环里把x/10由于x是整型得到的是189,再%10得到9输出
再把x/10得到18
然后%10得到8
代码
#include<stdio.h>
int main()
{
int x = 0, y = 0;
scanf("%d", &x);
do
{
y = x % 10;
printf("%d", y);
x = x / 10;
} while (x != 0);
return 0;
}
最终版本
#include<stdio.h>
#include<math.h>
int main()
{
int x = 0, y = 0, z = 0, t = 0, m=0, i = 0;
printf("请输出最高为五位的数字:");
scanf("%d", &x);
z = x;
t = x;
do
{
z = z / 10;
i++;
} while (z != 0);
switch(i)
{
case 1:printf("为个位数\n");
break;
case 2:printf("为十位数\n");
break;
case 3:printf("为百位数\n");
break;
case 4:printf("为千位数\n");
break;
case 5:printf("为万位数\n");
break;
default:
printf("你小子是不是输入了大于五位的数?\n"); //算位数
return 0;
}
printf("输入的数字逐个输出为:\n");
do
{
i--;
m = t / pow(10, i);
printf("%d\n", m);
t = t - m * pow(10, i);
} while (t != 0);
printf("这个数字逆序输出为:");
do
{
y = x % 10;
printf("%d", y);
x = x / 10;
} while (x != 0); //逆序输出
return 0;
}
题目二
企业发放的奖金根据利润提成。利润I低于或等于 100 000 元的,奖金可提成10%:利润高于100 000 元,低于 200 000 元(100 000I<200 000)时,低于 100 000 元的部分按10%提成,高于 100 000 元的部分,可提成 7.5%;200 0001 000 000 时,超过1000 000 元的部分按 1%提成。从键盘输人当月利润 I,求应发奖金总数。
switch解决方案
错误示例
#include<stdio.h>
#include<math.h>
int main()
{
int I = 0, i = 0;
double I1 = 0, I2 = 0, I3 = 0, I4 = 0,
I5 = 0, I6 = 0, W = 0;
printf("请输入月利润:");
scanf("%d", &I);
i = (I / 100000) ;
if (I = i * 100000)
{
i = i - 1;
}
else
{
i = i;
}
switch (i)
{
default:
I6 = (I - 1000000) * 0.01;
//大于1000 000
case 7:
case 8:
case 9:
{
if (I > 1000000)
{
I5 = 400000 * 0.015;
}
else if(I <= 100000)
{
I5 = (I - 600000) * 0.015;
}
}
//大于600 000
case 4:
case 5:
{
if (I > 600000)
{
I4 = 200000 * 0.03;
}
else if(I <= 600000)
{
I4 = (I - 400000) * 0.03;
}
}
//大于400 000
case 2:
case 3:
{
if (I > 400000)
{
I3 = 200000 * 0.05;
}
else if(I <= 400000)
{
I3 = (I - 200000) * 0.05;
}
}
//大于200 000
case 1:
{
if (I > 200000)
{
I2 = 100000 * 0.075;
}
else if(I <= 200000)
{
I2 = (I - 100000) * 0.075;
}
}
//大于100 000
case 0:
{
if (I > 100000)
{
I1 = 100000 * 0.1;
}
else if(I <= 100000)
{
I1 = I * 0.10;
}
}
printf("%lf %lf %lf %lf %lf %lf\n", I1, I2, I3, I4, I5, I6);
printf("总奖金为%5.2f", W = (I1 + I2 + I3 + I4 + I5));
break;
}
return 0;
}
正确版本
# include <stdio.h>
int main()
{
int i, branch;
double bonus, bon1, bon2, bon4, bon6, bon10;
bon1 = 100000 * 0.1;
bon2 = bon1 + 100000 * 0.075;
bon4 = bon2 + 100000 * 0.05;
bon6 = bon4 + 100000 * 0.03;
bon10 = bon6 + 400000 * 0.015;
printf("请输入当月利润i:");
scanf("%d", &i);
printf("i=%d\n", i);
branch = i / 100000;
if (branch > 10) {
branch = 10;
}
switch (branch) {
case 0:bonus = i * 0.1; break;
case 1:bonus = bon1 + (i - 100000) * 0.075; break;
case 2:
case 3:bonus = bon2 + (i - 200000) * 0.05; break;
case 4:
case 5:bonus = bon4 + (i - 400000) * 0.03; break;
case 6:
case 7:
case 8:
case 9:bonus = bon6 + (i - 600000) * 0.015; break;
case 10:bonus = bon10 + (i - 1000000) * 0.01;
}
printf("奖金是%10.2f\n", bonus);
return 0;
}
if解决方案
不知道是否正确版
#include <stdio.h>
int main()
{
float I,r1,r2,r3,r4,r5,r6,bound1,bound2,bound3,bound4,bound5,bound6,I1;
r1=0.1;
r2=0.075;
r3=0.05;
r4=0.03;
r5=0.015;
r6=0.01;
I1=100000;
printf("请输入利润:");
scanf("%f",&I);
if(I<=100000)
{
bound1=r1*I;
printf("奖金为:%f",bound1);
}
else if(I<=200000)
{
bound2=I1*r1+(I-I1)*r2;
printf("奖金为:%f",bound2);
}
else if(I<=400000)
{
bound3=I1*r1+I1*r2+(I-2*I1)*r3;
printf("奖金为:%f",bound3);
}
else if(I<=600000)
{
bound4=I1*r1+I1*r2+2*I1*r3+(I-4*I1)*r4;
printf("奖金为:%f",bound4);
}
else if(I<=1000000)
{
bound5=I1*r1+I1*r2+2*I1*r3+2*I1*r4+(I-6*I1)*r5;
printf("奖金为:%f",bound5);
}
else if(I>1000000)
{
bound5=I1*r1+I1*r2+2*I1*r3+2*I1*r4+4*I1*r5+(I-10*I1)*r6;
printf("奖金为:%f",bound6);
}
return 0;
}
正确版
#include <stdio.h>
int main()
{
double I, salary = 0;
printf("enter performance:");
scanf_s("%lf", &I);
if (I < 0) {
printf("请输入一个正数\n");
system("pause");
return -1;
}
double salary1 = 100000 * 0.1;//10万的奖金
double salary2 = (200000 - 100000) * 0.075 + salary1;//20万的奖金
double salary3 = (400000 - 200000) * 0.05 + salary2;//40万的奖金
double salary4 = (600000 - 400000) * 0.03 + salary3;//60万的奖金
double salary5 = (1000000 - 600000) * 0.015 + salary4;//100万的奖金
if (I <= 100000) {
salary = I * 0.1;//小于100000按10%提成
}else if (I > 100000 && I <= 200000) {
salary = salary1 + (I - 100000) * 0.075;//多出10万的按比例计算,加上10w的奖金
}else if (I > 200000 && I <= 400000) {
salary = salary2 + (I - 200000) * 0.05;//多出20万的按比例计算,加上20w的奖金
}else if (I > 400000 && I <= 600000) {
salary = salary3 + (I - 400000) * 0.03;//多出40万的按比例计算,加上40w的奖金
}else if (I > 600000 && I <= 1000000) {
salary = salary4 + (I - 600000) * 0.015;//多出60万的按比例计算,加上60w的奖金
}else if (I > 1000000){
salary = salary5 + (I - 1000000) * 0.01;//多出100万的按比例计算,加上100w的奖金
}
printf("salary:%f\n", salary);
system("pause");
return 0;
}
Comments NOTHING