易語言版本:未做太多異常處理,僅演示演算法


template&
constexpr auto res = N % 10 + res&;
template&
constexpr auto res&<0&> = 0;


d 進位,JavaScript,Y組合子版

d =&> n =&> fixed(recur =&> n &< d ? n : (recur(Math.floor(n/d)) + n%d))


如果是字元串,就一位一位取出來加。

如果是數字,那就每次除10取餘數,把餘數相加。寫個簡單的思路

Int a = 0;

a += n%10;

n = n /10;

這樣循環一下就行了


這樣:

def sumOfBits(n:Int) = {
n.toString.map(_.toString.toInt).sum
}


以js為例

var str = String(n)

var res= 0

for(let s of str) {

var l = Number(s)

if(isFinite(l)) res+=l

}

int sum = 0;

for(;n;n/=10) sum += n % 10;


來了來了,python必須要有排面!

def sum_num(n):
"""
計算n的每一位相加求和
:param n: int.
:return: int.
"""
result = 0
for x in str(n):
result += int(x)
return result

print(sum_num(12))

以上!


有很多方法,這裡展示一種JAVA方法


while(n&>0){

sum+=n%10;

n/=10;

}

return sum;

分別取出n的每一位 然後相加就好了


數字打成字元串,遍歷一遍字元串,加就完了。數字怎麼打成字元串方法無數,根據你的語言搜索引擎搜一下


人生苦短,我用python

將字元串轉換成列表,遍歷列表求和,注意數字類型的轉換


這個問題看上去很業餘,大神們都用循環啊、模版啊,寫了各種語言的版本,附帶了各種「小夥子你還年輕「的眼光。

還是有一些大神提出了好問題:「2/8/16/10 ,哪個進位啊?「

啊,不禁讓我想起了早年玩過的各種二進位演算法——如果是2/8/16進位的話,是有高速演算法的。思想也很簡單——折半。32位數計算2進位數字只需要5步(當然是高級語言,不是指令哈哈哈),沒有判斷條件的跳出,非常非常流水線,CPU很喜歡。

基本演算法入下,show me the code: 假設輸入為X(32位)

// X is the input, assuming `unsigned long`
X = (X0x55555555) + ((X&>&>1)0x55555555)
X = (X0x33333333) + ((X&>&>2)0x33333333)
X = (X0x0F0F0F0F) + ((X&>&>4)0x0F0F0F0F)
X = (X0x00FF00FF) + ((X&>&>8)0x00FF00FF)
X = (X0x0000FFFF) + ((X&>&>16)0x0000FFFF)
// now X is the bits number of original X

好玩吧,不需要除法,木有循環,木有判斷,速度奇快。

  • 當然,很容易擴展到 64整數和有符號數
  • 擴展到 8 / 16 進位會稍稍麻煩

聰敏如你,一定可以搞定的,對吧?

ps:聽說有的CPU還有專門的計數2進位bit的指令,具體忘光光啦。


這個問題大體分兩步。

第一步:如何把每個位數取出來。

第二步:將每個位數相加。

難度主要在第一步,第二步可能只需進行下類型轉換即可。

下面詳細講解下第一步:

方法1:利用數學中的位數變換將每位求出。如除十取余得個位;除第一位權值取整得第一位數值等。

方法2:將數字n轉換成字元串即字元數組。遍歷字元數組將字元類型轉換為整數即可。


介紹一種很古老的編程方法:由頂向底逐步求精。

就拿這個題目來說「計算n的每位數字之和」。

翻譯翻譯,目標是:對給定的一個數字,計算出每一位上面的數字,並把他們累加起來。

經過翻譯,我們把目標寫成了3句話:

1,需要一個數字

2,計算數字每一位上的數目字(我們大概需要把這些存下來以便累加)

3,把求出來的這些數字累加起來

對於已經給定的數字,我們需要做的步驟是兩部:求每位上的數字 累加

累加通常問題不大,這道題的難點基本在於如何求每一位上的數字。把這個問題解覺了,這道編程題基本就解決了。簡單能想到的求值方案就倆,大方向一個是把給定數值當做數值型數據來計算(10除取余,具體自己去想和實現),另一個方向是把給定數值當做字元串去處理,從0位置到len - 1位置按位取子字元串轉換成數值型再累加。

當做字元串處理沒啥意思,通常也不建議初學者這樣解決問題。

當然了,寫出完整的程序並不是把這個計算方法想明白就成。根據使用的語言不同,編寫代碼所需要留意的細節也各不相同,自己去聯繫寫出完整的代碼,也是對於你掌握這門語言的必要練習。


是幾進位的位,二 八 十 還是十六


提供一個思路:

1、轉化為字元串

2、遍歷字元串,轉化為數組

3、求和


這個問題,我用java嘗試實現一下吧,不知道你這個n有沒有具體限制,下面是源代碼,僅供你參考一下:

/**
* 計算傳入數n的各個位之和
*
* @param n
* @return
*/
public static int calcSumByN(int n) {
// 給n取絕對值
n = Math.abs(n);
int sum = 0;
do {
// 用n與10取模,獲取此時最低位的值,然後與sum相加
sum += n % 10;
// n 整除10,相當於進一位
n = n / 10;
} while (n &>= 10);
sum += n; // 加上最後的最高位
return sum;
}

上面只是一個簡單實現,代碼中的邏輯已經注釋過了,你可以看一下是否滿足需求。共同學習,共同進步!


上面的回答太業餘了,隨便一個用例都跑不了。以工程代碼為例,n首先肯定不能假定用戶輸入的是整數,考慮幾種最基本情況:

1.n是小數的情況,例如:n是12.36,那麼結果是1+2+3+6 = 12.

2.n是字母的情況,例如12ab34,那麼n是1+2 +3+4

3.考慮n是整數,但是存在長度超過32位或者計算機int存儲的最大值的情況例如n是1234567899897135145615156189132189156456189...。肯定不能使用int型數據。

考慮以上三種情況,上個C++版本的代碼:

運行結果:

這中代碼在一般的工業進程可以確保基本沒問題。例如:高中以下的數值計算,但是在科學計算中任然需要優化:

例如:

(1)代碼中的sum是int類型的,當數值足夠長,會越界。那麼如果計算量過大,可以考慮int64或者字元串進行存儲。

(2)計算效率,當n足夠長,時間複雜度是O(N),肯定不合格。


推薦閱讀:
相关文章