给一个数,求它是几位数?
示例:
输入:12345; 输出:5
int Count(long long number)
//定义一个long long类型的数是为了防止通不过数据特别大的测试用例
{
int tmp=0;//统计位数,初始化为0
if(number == 0)//考虑数为0的情况
{
return 1;
}
while(number != 0)
{
tmp++;
number /= 10;//丢弃个位数字
}
return tmp;
}
代码优化
int Count(long long number)
{
int tmp=0;//统计位数,初始化为0
do//0的情况不用单独拿出来了
{
tmp++;
number/=10;//丢弃个为数字
}while(number!=0);
return tmp;
}
拓展:特殊进制的位数
给定一个正整数,将它转化为十六进制数,它是个几位数?
思路:丢弃十六进制数的个位数字,计数器++,直到这个十六进制数字变为0.
示例1:
输入:12345678
输出:6
解释:12345678 转成十六进制为 0x BC614E,即 6 位.
示例 2:
输入:0x12345678
输出:8
示例 3:
输入:0X12AB34
输出:6
int Count(unsigned int number)
{
int count=0;//统计位数
do
{
count++;
number/=16;//丢弃十六进制的个位数
//求几进制的位数就/=几
}while(number!=0);
return count;
}
逆序输出:使用得到个位数字再丢弃个位数字的方法
示例:
输入:12345 输出:5 4 3 2 1
void ReversePrint(long long number)
{
do
{
printf("%d ",number%10);//得到个位数字并打印
number/=10;//丢弃个位数字
}while(number!=0);
printf("\n");
}
顺序输出:得到最高位数字然后再丢弃最高位数字
示例:
输入:12345 输出1 2 3 4 5
12345 5位数
最高位: 12345/10000(10^4)
12345%10000=2345
10000/10=1000
最高位:2345/1000(10^3)
2345%1000=345
1000/10=100
…
利用循环解决该问题:
void Print(long long number)
{
if(number==0)
//这个判0是不能缺的,否则后面pow这个库函数里面10^0==1会形成死循环
{
printf("0\n");//如果是0打印0
return ;
}
int tmp=(int)pow(10.0,Count(number)-1);//这里需要用到math.h
while(number!=0)
{
printf("%d ",number/tmp);//输出最高位数字
number%=tmp;//求除最高位以外的剩余数字
tmp/=10;
}
printf("\n");
}
递归调用解决该问题:
void Print(long long number)
{
if(number>=10)
{
Print(number/10);//递归输出最高位数字
}
printf("%d ",number%10);//打印个位数字
}