簡體   English   中英

10 如何分隔 n = 10 * n + (s[i] - '0') 中的數字?

[英]How does 10 separate the digits in n = 10 * n + (s[i] - '0')?

此函數將一串數字轉換為其等效的數字:

int atoi(char s[])
{
    int i, n;

    n = 0;
    for ( i = 0 ; s[i] >= '0' && s[i] <= '9' ; ++i )
    {
        n = 10 * n + (s[i] - '0');
    }
    return n;
}

我的問題是關於這一行 -> n = 10 * n + (s[i] - '0');

特別是這部分10 * n 我不明白 10 影響執行的方式。 如果我刪除它,表達式只是將數字相加。 我不明白 10 如何通過乘以 0 來分隔數字。

考慮數字 1234。它由數字 1、2、3 和 4 組成。如果您按該順序收到這些數字,則可以逐步構建原始數字:

n = 1
n = 1 * 10 + 2 = 12
n = 12 * 10 + 3 = 123
n = 123 * 10 + 4 = 1234

將其化為一個等式:

n = ((((1 * 10) + 2) * 10) + 3) * 10 + 4
  = ((1 * 10 * 10 + 2 * 10) + 3) * 10 + 4
  = 1 * 10 * 10 * 10 + 2 * 10 * 10 + 3 * 10 + 4
  = 1 * 1000 + 2 * 100 + 3 * 10 + 4
  = 1000 + 200 + 30 + 4
  = 1234

所以第一個數字比后面的數字乘以更多的 10。 它只是通過一次乘以一個來分配 10 的冪。

如果你有一個像1234這樣的數字,那么它可以像表達式的結果一樣獲得

( ( ( ( 0 ) * 10  + 1 ) * 10 + 2 ) * 10 + 3 ) * 10 + 4

如果數字存儲為字符符號,例如 '3' 那么要獲得數字3您可以編寫'3' - '0'

請注意,當傳遞的字符串包含負數或數字以符號“+”開頭時,顯示的函數將不起作用。

它的參數也應該用限定符const聲明,因為傳遞的字符串在函數中沒有改變。

int atoi( const char s[] );

正如我剛剛在另一個答案中寫的那樣,如果我讓你把數字34粘在一起形成一個新數字,你可以做10 × 3 + 4 = 34 ,如果我讓你把數字1234把它們粘在一起形成一個新的數字,你可以做100 × 12 + 34 = 1234

乘以 10 相當於在右邊加上一個 0 並將所有東西向左移動一個數字: 3 × 10 = 30 類似地,乘以 100 等效於在右側添加兩個 0,並將所有內容向左移動兩位數: 12 × 100 = 1200

在基數 10 中,每增加一個數字,左側數字的值就會增加 10 倍。

暫無
暫無

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

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