查找的數字
回答
使用modulo operation得到至少顯著數字的值:
int num = 23456;
int total = 0;
while (num != 0) {
total += num % 10;
num /= 10;
}
如果輸入可以是負數那麼這將是檢查這一點,反轉跡象是個好主意。
int sum=0;while(num){sum+=num%10;num/=10;}
無論如何,如果num爲負值,則在C99中給出否定答案。
這功課嗎?
謝謝你。不做作業,失去與編碼的聯繫,再次學習C. – Josh 2010-08-16 02:38:36
這比基本的數學算法更符合C. – 2010-08-16 06:02:39
#include <stdio.h>
int main()
{
int i = 23456;
int sum = 0;
while(i)
{
sum += i % 10;
i /= 10;
}
printf("%i", sum);
return 0;
}
@Josh不用擔心伴侶。 – 2010-08-16 03:05:28
如果你想辦法做到這一點沒有控制語句,以及難以置信的高效率來引導,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];
}
:-)
不幸的是它在空間中是'O(2^n)'。 ;-) – 2010-08-16 06:04:09
事實上,我回答了另一個(有點幽默)的答案,它使用了一個絕對巨大的數組進行表查找,但回想起來,這並不是一個壞主意,只要限制表的大小。
以下功能爲時間換取空間。與所有優化一樣,您應該自己在目標環境中進行配置。
首先(優雅)遞歸版本:
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倍,但你可能想編寫一個程序來生成上面的靜態數組語句:-)
與所有優化選項一樣, 措施,不要猜測!
我更喜歡更優雅的遞歸解決方案,但我也是那些喜歡隱祕填字的類型之一。讀到你想要的。
堆棧幀命中內存。查找表需要高速緩存,然後他們吃掉你的緩存。一個足夠聰明的編譯器可能會注意到,在這種情況下,遞歸等同於迭代,但這不太可能,因爲您的實現甚至不是尾遞歸。喜歡小代碼,所以你不吃你的緩存。 – 2010-08-16 21:50:46
#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碼數表示
#include<stdio.h>
main()
{
int sum=0,n;
scanf("%d",&n);
while(n){
sum+=n%10;
n/=10;
}
printf("result=%d",sum);
}
和這裏的另一個想法是數n
- 1. Unix查詢---查找數字
- 2. 查找字母數字的Haskell函數
- 3. 查找數字的因子
- 4. 查找數量的字典
- 5. 查找字符串中的字數
- 6. 查找字符串中的數字xslt
- 7. 查找數組中缺失的數字
- 8. 查找數字的餘數部分
- 9. Java java.lang.ArithmeticException查找數字的倍數
- 10. 查找數字「內」的最大素數
- 11. 在Swift中查找數字的總數
- 12. 查找LinkedList中數字的中位數
- 13. 查找以數字爲模的倒數
- 14. 在PHP中查找數字的倍數
- 15. 查找數組中的數字組合
- 16. 查找數組中的特殊數字
- 17. 查找回文數字
- 18. 用C++查找數字
- 19. 查找輸入數字
- 20. 查找比數組給定數字的比較大的數字
- 21. 查找最接近給定數字的數組中的數字
- 22. 查找字段的字段
- 23. 在字符串中查找數字
- 24. 查找PHP數字字符串
- 25. 在字符串lua中查找數字
- 26. 字符串數組查找字典
- 27. 在字符串中查找數字
- 28. 如何查找數字字符串中最頻繁的數字?
- 29. 查找字符串中的數字字符串,並計數
- 30. 字典查找與數組查找;數組重定位與字典分配
的數字之和的答案是20 – 2010-08-16 02:26:07
燁卡爾....我想知道如何使用C – Josh 2010-08-16 02:28:11
@Josh來計算它,然後告訴我們你迄今爲止所做的事情,並向我們提出一個具體問題。要求我們做家庭作業(或更糟,真正的工作),在這裏不會很受歡迎。 – 2010-08-16 02:29:51