**
C语言之数字处理中的常见问题
**
问题1:如何统计一个数字n是几位数?
算法思想:定义一个记录数字位数的变量t(计数器),并初始化0,每丢弃一次个位数字时,计数器++1,直到被处理的数字n==0.
源代码:
int Count(long long)
{
int t = 0; // 计数器
if(n == 0) //特视情况0
return 1;
while(n !=0)
{
t++;
n /= 10; //丢弃个位数字
}
return t;
}
测试用例:
测试用例要尽量详细,防止出现bug,这里为了函数功能范围更宽,使用llong long数据类型
测试结果:
问题2:如何顺序输出数字n的每一位数字?
算法思想:先得到数字n的高位,然后输出高位,再丢弃高位,直到n==0;
其中得到高位的方法是:借助于已有的Count(n)函数得到该数字n的位数t;
则第一个求最高位的除数的值就是pow(10.0,t-1);
第一个最高位就是n/power;
综上:
源代码:
void Show(n)
{
if(n == 0)
{
printf("0\n");
return; //提前结束该函数
}
else if(n < 0) //负数处理
{
printf("-");
n = -n;
}
int t = Count(n); //得到位数t
int power = (int)pow(10.0,t - 1); //得到第一个除数
while(n != 0)
{
printf("%d",n/power) ; //输出最高位
n %= power; //丢弃上一个最高位
power /= 10;
}
printf("\n");
}
测试用例:
测试结果:
容易看到上述程序在Show(1234567800)这里出现bug:最后两位00没有被输出。
解决方法:用for循环代替while循环,可以让所有数字的输出直到最后一位数
代码修改:
for (int i = 0;i<t;i++)
{
printf("%d ",n/power);
n %= power;
power /= 10;
}
测试结果:
Bug修复!!!!!!!!!
问题3:如何逆序输出n的每一位数字
算法思想:先得到个位,然后输出这个个位,最后丢弃;重复该操作,直到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");
}
测试用例:
测试结果: