我必须计算一个数字中的位数。
我将数字除以10,直到得到0.每次迭代都会递增计数器。
int num;
cin>>num;
while(num > 0)
{
counter++;
num = num / 10;
}
挑战不是使用任何循环或递归,只是if
语句。
有可能吗?
答案 0 :(得分:10)
counter = log(num)/ log(10)
在c ++中:
#include <cmath>
....
counter = num == 0 ? 1 : log10(std::abs(num)) + 1;
你想要的是日志功能。
cplusplus - log10
cplusplus - std::abs
答案 1 :(得分:3)
简单的方法虽然有些昂贵,但请将您的号码转换为字符串并将其大小调整为以下示例:
#include <iostream>
#include <string>
int main() {
int i = 1232323223;
std::string str = std::to_string(std::abs(i));
std::cout << "Number of Digits: " << str.size() <<std::endl;
}
答案 2 :(得分:3)
一种方法是使用sprintf
,因为它返回发出的字符数:
int digits(int n)
{
char s[32];
int len = sprintf(s, "%d", n);
if (n < 0) len--; // NB: handle negative case
return len;
}
答案 3 :(得分:3)
确定可能,例如(对于32位数字):
int numDigitsU (unsigned int n) {
if (n < 10) return 1;
if (n < 100) return 2;
if (n < 1000) return 3;
if (n < 10000) return 4;
if (n < 100000) return 5;
if (n < 1000000) return 6;
if (n < 10000000) return 7;
if (n < 100000000) return 8;
if (n < 1000000000) return 9;
/* 4294967295 is 2^32-1 - add more ifs as needed
and adjust this final return as well. */
return 10;
}
签名变体有点棘手,因为标志首先是反转的,你必须注意MININT
:
int numDigitsS (int n) {
if (n == MININT) n = MAXINT; // same number of digits, usually.
if (n < 0) n = -n; // reverse sign.
return numDigitsU (n); // call the unsigned variant.
}
只需根据最大unsigned int
的尺寸调整最高比较值和返回值。
这应该适用于所有允许的负面编码:两个补码,一个&#39;补充和符号/幅度。
答案 4 :(得分:3)
如果您认为int
的最大大小是有限的,那么实际上很容易。只需检查数字是否大于10,大于100,大于1000等。您甚至可以进行二分搜索。
int num = abs(number);
if (num < 10000)
{
if (num < 100)
return num < 10 ? 1:2;
else
return num < 1000 ? 3:4;
}
else
{
...
}
答案 5 :(得分:0)
只需执行以下操作即可找到整数的长度:
int countDigits(int *num){
int count =0;
while(*num>0){
count++;
*num /=10;
}
return count;
}