给一个整数(以123456为例),要求:
(1)求出它是几位数
首先确定思路,对于123456要输出6,除以10可以直接丢弃最低位,只需记录除了几次10就可以得到几位数。代码实现:
int count = 0;
int m = n;
while(n != 0)
{
count++;
n /= 10;
}
再考虑边界值0的问题,直接输出1位就好:
if(n == 0)
{
printf("1\n");
return 0;
}
(2)分别输出每一位数字
需要顺序输出1、2、3、4、5、6,首先得到原数是个几位数字(上一问得到),输出最高位需要用原数除以100000得到1,2是23456除以10000得到,这就需要考虑怎么得到需要除以的数,并考虑怎么得到最高位并输出,再丢弃最高位。
int m = n;
//计算需要除以的数字
int power = (int)pow(10.0,count-1);
while(m != 0)
{
printf("%d ",m/power);//输出最高位
m %= power;//丢弃最高位
power /= 10;
}
这里的边界值0输出的是0:
if(n == 0)
{
printf("0\n");
return 0;
}
(3)按逆序输出各位数字,例如原数为321,应输出123.
需要逆序输出6、5、4、3、2、1,和第一问一样的思想,是对最低位的操作,这里直接输出最低位并丢弃就可。
while(n != 0)
{
printf("%d ",n%10);//输出个位
n /= 10;//丢弃个位
}
这里的边界值处理和第二问一样的处理,最后整理代码:
#include <stdio.h>
#include <math.h>
int GetFigures(long long n)
{
int count = 0;
while(n!=0)
{
n /= 10;
count++;
}
return count;
}
void PrintOrder(long long n)
{
int count = GetFigures(n); /*获取n的位数*/
int power = (int)pow(10.0,count-1); /*获取n最高位数字需要除模的数字*/
if (count == 0) /*处理边界值0*/
{
printf("0\n");
}
if (n < 0) /*n小于0先打印“-”再处理数值*/
{
n = -n;
printf("-");
}
while(n != 0)
{
printf("%d ",n/power);
n %= power;
power /= 10;
}
printf("\n");
}
void PrintReverse(long long n)
{
int temp;
if (n == 0) /*处理边界值0*/
{
printf("0\n");
}
if (n < 0) /*n小于0先打印“-”再处理数值*/
{
n = -n;
printf("-");
}
while(n != 0)
{
printf("%d ",n % 10);
n /= 10;
}
printf("\n");
}
int main()
{
printf("%d\n",GetFigures(123456));
PrintOrder(123456);
PrintReverse(123456);
return 0;
}
总结:最高位的操作:获取最高位数字需要除模的数字,除以它得到最高位数字,对它取余丢弃最高位。
最低位的操作:对10取余得到最低位数字,除以10丢弃最低位数字。