簡體   English   中英

在 C 或 C++ 中使用 switch 查找整數的長度

[英]Finding the length of an integer with switch in C or 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();    
}

所以,我不知道我可以用什么來代替案例。

如果你使用的是 GCC 擴展,可以描述如下。

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

使用一系列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 為底的對數是有問題的。

您可以將以下方法與 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;
    }

您不能為此目的使用switch 。請switch if-else語句

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

int main() {
    int a,length;
    std::cout << "Please enter a number:\n";
    std::cin >> a;
    if(a<0)
        a=-a;
    if( a >= 1 && a < 10 )
        length = 1;
    else if( a >= 10 && a < 100 )
        length = 2;
    /* .............. */

    std::cout << "It has "<< length <<" numbers\n"; 
    getch();    
}

您不能在 switch case 中使用比較。 我會推薦一系列 if else if 在這種情況下逐漸降低限制:

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

根據您要處理的位數添加任意數量的數字。

另請注意,您必須分配給length 當您執行length==1您將返回一個布爾值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM