来看第一个问题:
一、统计一个整数的位数
首先我们想到了使用算数运算符“分割”这个整数,同时还需要一个变量来存储整数的位数,然后就可以使用一个循环来解决这个问题,那么要用什么循环去解决呢?由于我们需要处理的数据有待输入,事先不能确定循环次数,所以我们最好的方式是采用do-while循环(使用while循环时遇到输入数据为0时不方便处理)。代码如下:
#include<stdio.h>
int main(void)
{
int num;
int a=0;
scanf("%d",&num);
do
{
a++;
num/=10;
}while(num);
printf("%d",a);
}
二、逆序输出一个整数的各位数字
现在我们需要将一串数字逆序输出,如何做到呢?一个办法是将这个数字的每一位数字都保存下来然后逆序打印,利用求余的算数运算符来实现这波操作。代码如下:
#include<stdio.h>
int main(void)
{
int num;
int a=0;
scanf("%d",&num);
do
{
a=num%10;
num/=10;
printf("%d",a);
}while(num);
return 0;
}
但是这个程序并不完整,比如当我们输入除了最高位其余位均为0的数字时,打印出现的就会是以0开头的数字,在我们看来这并不是一个正确的整数,那么我们又该如何去做呢?直接上代码!
#include<stdio.h>
int main(void)
{
int num;
int a=0;
scanf("%d",&num);
do
{
a=num%10;
num/=10;
if(a!=0)
printf("%d",a);
}while(num);
return 0;
}
现在我们的程序依旧有问题,那就是:如果0处于整数最高位和最低位之间时,那么将无法输出0这个数字,我们换个思路重新去解决这个问题,这种方式只需要一个while循环即可;
#include<stdio.h>
int main(void)
{
int num,t=0;//注意变量的初始化,要保持好习惯
scanf("%d",&num);
while(num!=0)//循环条件依旧
{
t=t*10+num%10;//这样写的原因是使得到的数字进位,这样就不用一位一位那么麻烦地输出了
num/=10;
}
printf("%d",t);
}
三、正序输出整数的各位数字,先试一下两次逆序能不能实现,代码如下
#include<stdio.h>
int main(void)
{
int num,t=0,x;
scanf("%d",&num);
while(num!=0)
{
t=t*10+num%10;
num/=10;
}
x=0;
while(t)
{
x=x*10+t%10;
t/=10;
}
printf("%d",x);
}
很明显不完全可以,为什么呢,因为如果输入的数个位为0的话,在第一次循环的时候我们的变量t就不会发生任何改变,相当于位数少了一次;同理,如果输入的数为70000的话,我们只能够得到7这个数字。我们不妨利用再添加一个变量,此题正解代码如下,含注释!!!
#include<stdio.h>
int main(void)
{
int num,pow=1,x;
scanf("%d",&num);
int t=num;
while(t>9)//这里要注意循环条件不能是t!=0 否则会出现问题
{
t/=10;
pow*=10;
}
do
{
x= num/pow;
printf("%d ",x);
num%=pow;//每次循环后整数要去掉最高位
pow/=10;//使pow与整数的位数一致
}while(pow>0);
return 0;
}
此题的另一种写法是:
#include<stdio.h>
int main(void)
{
int num,pow=1,x;
scanf("%d",&num);
int t=num;
while(t>9)//这里要注意循环条件不能是t!=0 否则会出现问题
{
t/=10;
pow*=10;
}
while(pow>=1)
{
x=num/pow;
printf("%d ",x);
num %= pow;
pow/=10;
}
return 0;
}
|