数字的数字没有循环C ++

时间:2014-09-08 09:32:23

标签: c++

我必须计算一个数字中的位数。

我将数字除以10,直到得到0.每次迭代都会递增计数器。

int num;
cin>>num;  
while(num > 0)  
{  
  counter++;
  num = num / 10;   
}

挑战不是使用任何循环或递归,只是if语句。

有可能吗?

6 个答案:

答案 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;
}

LIVE DEMO

答案 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;
}