原问题来自MOOC《程序设计入门-C语言》:
分析:利用C语言的整除与求余及十进制数的数码权值等知识分别将数字给“提取”出来。因为要求最低位为0时不将其输出,所以在将数字分解之后还需要将其合成为一个三位数字而不是作为三个独立的数码。
基础知识:权值基数数码相关知识
代码1:从大到小一位一位的取
#include<stdio.h>
int main()
{
//逆序三位数输出
//127 /100 %100/10 %100%10 %100%10/1..... 上一位求余这一位整除
int m,n,a,b,c;
scanf("%d",&m);
a = m/100;//取出百位数
b = m%100/10;//取出十位数
c = m%100%10;//取出个位数 更加简便的是--m%10
n = c*100+b*10+a;
printf("%d",n);
return 0;
}
代码2:缩小整个数字,快速取:
抛去了冗余的步骤,写的代码显然比代码一少了。有两个特殊的位,最高位是直接整除它的权,最低位直接求余它上一位即十位的权。可以记作 x/本位权值%10.
拿976举例。对于7,976/10可以去掉7之后的位数,剩下97,97%10就取得了现在作为新数字个位数的7。
#include<stdio.h>
int main()
{
int a,b,c,m,n;
scanf("%d",&m);
a = m/100;
b = m/10%10;//本位整除10位求余 987 98 8 1234 123 3
c = m%10;
n = a + b * 10 + c * 100;
printf("%d",n);
return 0;
}
代码3:根据代码2可以得出求逆序n位数的办法,比如6位数的:
#include<stdio.h>
int main()
{
//逆序6位数输出 100 0000-1=99 9999
//127 /100 %100/10 %100%10 %100%10/1.....
int m,n,a,b,c,d,e,f;
scanf("%d",&m);
c = m%10;//取出个位数
b = m/10%10;//取出十位数
a = m/100%10;//取出百位数
d = m/1000%10;
e = m/10000%10;
f = m/100000;
n =f+e*10+d*100+a*1000+b*10000+c*100000;
printf("%d",n);
return 0;
}