首先我想到了先将输入的数逆序,然后再拆解,就能得到正序拆解的数,于是有了以下的代码
#include<stdio.h>
int main()
{
int x,y,z; //z是逆序之后的数字
int sum=0;
scanf("%d",&x);
while(x>0){
y=x%10;
x=x/10;
sum=sum*10+y;
}
while(sum>0){
z=sum%10;
printf("%d ",z);
sum=sum/10;
}
return 0;
}
当时写的时候在sum=sum*10+y犹豫了一会,不知道该怎么去处理;编译运行之后,发现正常的数字能够符合条件,但是当尝试了700之后发现输出仅仅是7,程序在第二个循环出现了问题,于是有了以下的方案。
方案一:先测出该整数的总位数,再从最高位开始取余。
#include<stdio.h>
int main(void)
{
int n;
int i=1,pow=1;
int temp;
scanf("%d",&n);
temp=n;
while(n/10){ //这时测n的位数,当temp在1-9之间时,循环就已经做好了,但是如果条件是temp,那么i将会继续加1;
n/=10;
pow*=10;
i++; //计数器,记下temp的位数,作为下一个循环的条件
}
while(i){ //此时的n已经发生变化,变成了n的个位数,所以要在开头定义一个变量去代替n
printf("%d ",temp/pow);
temp%=pow;
pow/=10;
i--;
}
return 0;
}
方案二:引用数组,先从最低位开始取余,最后将数组倒着输出。
#include<stdio.h>
int main(void)
{
int a[50]={0};
int n;
int i=0;
scanf("%d",&n);
if(0==n){ //当n=0时的特殊情况
printf("0 \n");
return 0;
}
for(i=0;n;i++){
a[i]=n%10;
n/=10;
}
i--; //数组从a[0]开始,所以i的最大值是n的位数减一,因此这个地方要i--
while(i>=0){
printf("%d ",a[i]);
i--;
}
return 0;
}
方案三:将该整数看成若干个数字字符组成的字符串,将字符串中的所有数字逐个输出。
#include<stdio.h>
int main(void)
{
char c;
do{
scanf("%c",&c);
if(!(c>='0'&&c<='9'))//利用最后输入的回车键也会被看做字符被scanf读取的特点跳出循环
break;
printf("%c ",c);
}while(c>='0'&&c<='9');
return 0;
}
或者
#include<stdio.h>
int main(void)
{
char c;
c=getchar();
while(c<='9'&&c>='0'){
putchar(c);
printf(" ");
//printf("%c ",c);
c=getchar();
}
return 0;
}