使用C或C ++中的开关查找整数的长度

时间:2015-11-24 10:13:22

标签: c++

我想通过使用switch语句找到C或C ++中整数的长度我知道还有其他简单的方法,但我想出于某些原因使用这种方法,所以这是我到目前为止所尝试的:

#include <iostream>
#include <conio.h>

main() {
int a,length;
std::cout << "Please enter a number:\n";
std::cin >> a;
if(a<0)
    a=-a;
switch(a){
case 1<...<10:length==1,break;
case 10<...<100:length==2,break;
case 100<...<1000:length==3,break;
}
std::cout << "It has "<< length <<" numbers\n"; 
getch();    
}

所以,我不知道我可以使用什么而不是案例。

5 个答案:

答案 0 :(得分:2)

很有可能使用一系列if语句,例如

if (a >= 10000){
    length = 5;
} else if (/* And so on

但这需要您对int的可能的最大大小进行假设。这不是由C或C ++定义的,尽管最小可能范围是[-32767到+32767]。

某些编译器允许您使用基于范围的 switch,但这是(i)不是标准C或C ++,以及(ii)您仍然会遇到问题可能的范围高于。

更好的方法是重复将int除以10并计算您可以执行此操作的次数,直至达到零。并且不要忘记用负数和初始值0测试你的工作。

计算基数为10的对数是有问题的,因为计算发生在浮点上。

答案 1 :(得分:2)

如果您使用的是GCC扩展,可以描述如下。

switch(a){
case 1 ... 9     : length = 1; break;
case 10 ... 99   : length = 2; break;
case 100 ... 999 : length = 3; break;
}

答案 2 :(得分:1)

您可以在switch语句中使用以下方法。虽然在我的示范程序中我只使用标签default,但您可以包含与枚举相对应的任何案例标签

#include <iostream>

int main()
{
    while ( true )
    {        
        enum : unsigned int { One = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine } digits;

        std::cout << "Enter a non-negative number (0-exit): ";

        unsigned int x = 0;
        std::cin >> x;

        if ( !x ) break;

        int len;


        switch ( ( digits = One,   x < 10 ) ||
                 ( digits = Two,   x < 100 ) ||
                 ( digits = Three, x < 1000 ) ||
                 ( digits = Four,  x < 10000 ) ||
                 ( digits = Five,  x < 100000 ) ||
                 ( digits = Six,   x < 1000000 ) ||
                 ( digits = Seven, x < 10000000 ) ||
                 ( digits = Eight, x < 100000000 ) ||
                 ( digits = Nine,  x < 1000000000 ), digits )
        {
                default:
                    len = digits;
                    break;
        }

        std::cout << x << " has " << len << " digits." << std::endl;
    }        
}

程序输出可能看起来像

Enter a non-negative number (0-exit): 1
1 has 1 digits.
Enter a non-negative number (0-exit): 11
11 has 2 digits.
Enter a non-negative number (0-exit): 111
111 has 3 digits.
Enter a non-negative number (0-exit): 1111
1111 has 4 digits.
Enter a non-negative number (0-exit): 11111
11111 has 5 digits.
Enter a non-negative number (0-exit): 111111
111111 has 6 digits.
Enter a non-negative number (0-exit): 1111111
1111111 has 7 digits.
Enter a non-negative number (0-exit): 11111111
11111111 has 8 digits.
Enter a non-negative number (0-exit): 111111111
111111111 has 9 digits.
Enter a non-negative number (0-exit): 0

交换机的替代表示,包括其他案例标签

    switch ( ( digits = One,   x < 10 ) ||
             ( digits = Two,   x < 100 ) ||
             ( digits = Three, x < 1000 ) ||
             ( digits = Four,  x < 10000 ) ||
             ( digits = Five,  x < 100000 ) ||
             ( digits = Six,   x < 1000000 ) ||
             ( digits = Seven, x < 10000000 ) ||
             ( digits = Eight, x < 100000000 ) ||
             ( digits = Nine,  x < 1000000000 ), digits )
    {
        case One:
            std::cout << "You could enter more digits.." << std::endl;
        case Two: case Three: case Four: case Five: case Six: case Seven: case Eight:
            len = digits;
            break;
        case Nine:
            std::cout << "Do you like money?" << std::endl;
            len = digits;
            break;
        default:
            std::cout << "Too big number! It can be never" << std::endl;
            break;
    }

答案 3 :(得分:0)

您无法将^(?=\D*\d)(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])[\w~@#$%^&*+=`|{}:;!.?\"()\[\]-]{8,25}$ 用于此目的。请使用switch语句

if-else

答案 4 :(得分:0)

您无法在切换案例中使用比较。如果在这种情况下逐渐降低限制,我会推荐一系列if else:

if (a >= 100) length = 3;
else if (a >= 10) length = 2;
else length = 1;

添加您想要处理的位数所需的数量。

另请注意,您必须分配到length。当您执行length==1时,您将返回一个布尔值。