2010-08-16 63 views
3

我有一個5位數的整數的總和,說查找的數字

int num = 23456; 

如何找到它的數字的總和?

+10

的數字之和的答案是20 – 2010-08-16 02:26:07

+5

燁卡爾....我想知道如何使用C – Josh 2010-08-16 02:28:11

+1

@Josh來計算它,然後告訴我們你迄今爲止所做的事情,並向我們提出一個具體問題。要求我們做家庭作業(或更糟,真正的工作),在這裏不會很受歡迎。 – 2010-08-16 02:29:51

回答

14

使用modulo operation得到至少顯著數字的值:

int num = 23456; 
int total = 0; 
while (num != 0) { 
    total += num % 10; 
    num /= 10; 
} 

如果輸入可以是負數那麼這將是檢查這一點,反轉跡象是個好主意。

+0

@Mark。謝謝..這是我正在尋找的。 – Josh 2010-08-16 02:37:12

+0

我實際上並不是那麼喜歡'while(num)'的東西,除非'num'是一個實際的布爾類型值。我認爲它更具可讀性(除非你的編譯器死腦筋)使用'if(num!= 0)'。當然,我並不是不喜歡這樣做,所以我只是不贊成今天的正確答案,只是我今天沒有咆哮過,因爲這種咆哮是可恥的,所以必須這樣做:-) – paxdiablo 2010-08-16 03:06:37

+0

@paxdiablo:固定。 :) – 2010-08-16 03:10:34

3
int sum=0;while(num){sum+=num%10;num/=10;} 

無論如何,如果num爲負值,則在C99中給出否定答案。

這功課嗎?

+1

謝謝你。不做作業,失去與編碼的聯繫,再次學習C. – Josh 2010-08-16 02:38:36

+0

這比基本的數學算法更符合C. – 2010-08-16 06:02:39

4
#include <stdio.h> 

int main() 
{ 
    int i = 23456; 
    int sum = 0; 

    while(i) 
    { 
     sum += i % 10; 
     i /= 10; 
    } 

    printf("%i", sum); 

    return 0; 
} 
+0

@Josh不用擔心伴侶。 – 2010-08-16 03:05:28

2

如何:

for(sum=0 ,num=23456;num; sum+=num %10, num/=10); 
+0

謝謝你。 這是怎麼回事? 而且可以在沒有任何控制語句的情況下計算數字的總和。 – Josh 2010-08-16 02:43:47

+0

這個邏輯與Mark Byers的答案邏輯類似。 '而且沒有任何控制語句可以計算數字的總和嗎?爲什麼有人想要這樣做? – 2010-08-16 02:48:35

+0

謝謝。我只是想以不同的方式嘗試它.. – Josh 2010-08-16 02:52:50

2

如果你想辦法做到這一點沒有控制語句,以及難以置信的高效率來引導,O(1)而不是O(n), n = digit count方法:

int getSum (unsigned int val) { 
    static int lookup[] = { 
     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, //  0- 9 
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10- 19 
     2, 3, 4, 5, 6, 7, 8, 9, 10, 11, // 20- 29 
     : 
     9, 10, 11, 12, 13, 14, 15, 16, 17, 18, // 90- 99 
     : 
     14, 15, 16, 17, 18, 19, 20, 21, 22, 23, // 23450-23459 
     :: 
    }; 
    return lookup[23456]; 
} 

:-)

+1

不幸的是它在空間中是'O(2^n)'。 ;-) – 2010-08-16 06:04:09

1

輕微相關:如果你想repeated digit sum,一個很好的優化將是:

if (num%3==0) return (num%9==0) ? 9 : 3; 

其次是代碼的其餘部分。

0

事實上,我回答了另一個(有點幽默)的答案,它使用了一個絕對巨大的數組進行表查找,但回想起來,這並不是一個壞主意,只要限制表的大小。

以下功能爲時間換取空間。與所有優化一樣,您應該自己在目標環境中進行配置。

首先(優雅)遞歸版本:

unsigned int getSum (unsigned int val) { 
    static const unsigned char lookup[] = { 
     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // 0- 9 
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10- 19 
     2, 3, 4, 5, 6, 7, 8, 9, 10, 11, // 20- 29 
     : 
     18, 19, 20, 21, 22, 23, 24, 25, 26, 27 // 990-999 
    }; 
    return (val == 0) ? 0 : getSum (val/1000) + lookup[val%1000]; 
} 

它基本上分離具有固定查找每個可能性的數目爲三個位數的分組。這可以輕鬆處理一個64位無符號值,遞歸深度爲七個堆棧幀。

對於那些誰也不相信這遞歸量(你應該的,因爲正常的程序去深多,即使沒有遞歸),你可以嘗試迭代求解:

unsigned int getSum (unsigned int val) { 
    static const unsigned char lookup[] = { 
     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // 0- 9 
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10- 19 
     2, 3, 4, 5, 6, 7, 8, 9, 10, 11, // 20- 29 
     : 
     18, 19, 20, 21, 22, 23, 24, 25, 26, 27 // 990-999 
    }; 
    unsigned int tot = 0; 
    while (val != 0) { 
     tot += lookup[val%1000]; 
     val /= 1000; 
    } 
    return tot; 
} 

這些可能比一位一位數的解決方案快三倍,但需要花費千字節的數據。如果你不反對使用10K或100K,你可以將速度提高到4或5倍,但你可能想編寫一個程序來生成上面的靜態數組語句:-)

與所有優化選項一樣, 措施,不要猜測!

我更喜歡更優雅的遞歸解決方案,但我也是那些喜歡隱祕填字的類型之一。讀到你想要的。

+0

堆棧幀命中內存。查找表需要高速緩存,然後他們吃掉你的緩存。一個足夠聰明的編譯器可能會注意到,在這種情況下,遞歸等同於迭代,但這不太可能,因爲您的實現甚至不是尾遞歸。喜歡小代碼,所以你不吃你的緩存。 – 2010-08-16 21:50:46

0
#include <stdio.h> 
    2 #include <stdlib.h> 
    3 
    4 #define BUFSIZE 20 
    5 
    6 int main(void) 
    7 { 
    8   int  number = 23456; 
    9   char myBuf[BUFSIZE]; 
10   int  result; 
11   int  i = 0; 
12 
13   sprintf(myBuf,"%i\0",number); 
14 
15   for(i = 0; i < BUFSIZE && myBuf[i] != '\0';i++) 
16   { 
17     result += (myBuf[i]-48); 
18   } 
19 
20   printf("The result is %d",result); 
21   return 0; 
22 } 
23 

使用sprintf和ASCII碼數表示

0
#include<stdio.h> 
main() 
{ 
       int sum=0,n; 
       scanf("%d",&n); 
       while(n){ 
         sum+=n%10; 
         n/=10; 
       } 
       printf("result=%d",sum); 
} 

和這裏的另一個想法是數n