例题:给一个正整数,要求: 1.求出它是几位数; 2.按逆序输出各位数字; 3.分别输出每一位数字。
1.统计n是个几位数字
算法思想:
每次丢弃个位数字,计数器++,直到n为0;
注意:(丢弃个位:n/=10;得到个位 n%10)。
int Count(long long n)
{
int tmp = 0;
while(n != 0)
{
tmp++;
n /= 10;
}
return tmp;
}
int main()
{
printf("%d\n",Count(123456789));
printf("%d\n",Count(0));//bug
printf("%d\n",Count(-123456789));
printf("%d\n",Count(123456789987654321));
return 0;
}
测试用例,尽量详细,
printf("%d\n",Count(123456789));
printf("%d\n",Count(0));//bug
printf("%d\n",Count(-123456789));
printf("%d\n",Count(123456789987654321));
由于发现0处出现bug,故返回修改
int Count(long long n)
{
if(n == 0)
return 1;
int tmp = 0;
while(n != 0)
{
tmp++;
n /= 10;
}
return tmp;
}
若数字为0,则直接输出;
若不为0,每次丢弃个位数字,计数器++,直到n为0。
2.按逆序输出各位数字;
算法思想:得到个位,输出个位,再丢弃个位.重复左边,直到n为0;
void ReverseShow(int n)
{
if(n == 0)
{
printf("0\n");
return;//提前结束该函数
}
else if(n < 0)
{
printf("-");
n = -n;
}
while(n != 0)
{
printf("%d ",n%10);
n /= 10;
}
printf("\n");
}
int main()
{
ReverseShow(12345678);
ReverseShow(-12345678);
ReverseShow(0);
return 0;
}
测试用例,由于之前的bug,本次代码做出了提前修改,引入了对于0的判断;
ReverseShow(12345678);
ReverseShow(-12345678);
ReverseShow(0);
3.分别输出每一位数字
即为顺序输出每一位数字,例如1234—>1 2 3 4
算法思想:得到高位,输出高位,丢弃高位,直到为0。
void Show(int n)
{
if(n == 0)
{
printf("0\n");
return; //提前结束该函数
}
else if(n < 0) //负数处理
{
printf("-");
n = -n;
}
int tmp = Count(n);//得到n是几位数字
int power = (int)pow(10.0,tmp-1);//1234除以1000
while(n != 0)
{
printf("%d ",n/power);//输出最高位
n %= power;//丢弃最高位
power /= 10;
}
printf("\n");
}
int main()
{
Show(1234567800);
Show(-12345678);
Show(0);
return 0;
}
测试用例
Show(1234567800);//bug
Show(-12345678);
Show(0);
发现Show(1234567800)出现bug,最后两位00无法输出。
解决方法:用for循环代替while循环
void Show(int n)
{
if(n == 0)
{
printf("0\n");
return; //提前结束该函数
}
else if(n < 0) //负数处理
{
printf("-");
n = -n;
}
int tmp = Count(n);//得到n是几位数字
int power = (int)pow(10.0,tmp-1);//1234除以1000
for (int i = 0;i<t;i++)
{
printf("%d ",n/power);
n %= power;
power /= 10;
}
printf("\n");