思路:先获取x的位数,并确定位数对应的10的n次方,定义为i,用x不断除以i获取首位并输出,并用x%i的方式丢弃首位,i/=10不断对应x的位数,直到i已经不足10。
难点:这题其实分为三个小题:如何得到x的位数,如何得到x的首位,什么时候结束循环?要分成小个小题分别写出代码,同时,x作为本题中唯一一个输入变量,不能在第一次循环中就“消耗”掉x,要用新的变量替代。
特别要考虑如1-9这些个位数,10、20这些末尾为0的数输出结果,多用断点进行测试。
把思路也写在注释里面了。
#include <stdio.h>
int main() {
int x;
scanf("%d", &x);
int i = 1 ;
int t = x;//因为后续还会用到x,所以用新变量t去保存x的位数
// 思路:用/10的方式不断丢弃最低位,每丢弃一次i*10计算t的位数
// 12345/10=1234
// i*10=10
// 1234/10=123
// i*10=100
// 123/10=12
// i*10=1000
// 12/10=1
// i*10=10000
while (t > 9) {//要注意设置循环条件应为t>9
t /= 10;
i *= 10;
}
// 思路:从最高位开始分解如12345
// 12345/10000= 得到1 <<定义一个新的变量去保存这个数
// 12345%10000=2345
// 10000/10=1000
// 2345/1000= 得到2
// 2345%1000=345
// 1000/10=100
// 345/100= 得到3
// 345%100=45
// 100/10=10
// 45/10= 得到4
// 45%10=5
// 10/10=1
// 5/1= 得到5
// 5%1=5
// 1/10=0
do {
int d = x / i;
if (i >= 10) {
printf("%d-", d);//在最后一次输出前,i>=10,输出要带一个短横
} else {
printf("%d", d);//最后一次输出时,i已经变成1,输出不带短横
}
x %= i;//用%去丢掉x的首位
i /= 10;//i要和x的位数保持同步,所以每次除以10
} while (i > 0);
return 0;
}