題目描述
輸入乙個正整數m,請輸出從0到m中每乙個數字二進位制數中含有1的個數的總和,由於數值較大結果需要模100000.
輸入格式
乙個m輸出格式
二進位制數中含有1的個數的總和s
輸入輸出樣例輸入2
輸出2輸入5
輸出7說明/提示
樣例說明
20%的資料 m<=500
50%的資料 m<=1000
70%的資料 m<=50000000
100%的資料 m<=100000000
記憶體限制500mb
知識點:
統計kk這個數在二進位制的表示下有幾個1,**如下:
#include
using
namespace std;
intmain()
cout
}
解題思路:
這種解法,有幾個1就執行幾次。
把乙個整數減去1,再與原數字做按位與運算,會把原數二級制位中最右邊的1變成0.那麼乙個整數二進位制表示中有幾個1,就可以進行幾次這樣的操作。
0111減去1變成0110,二者進行與運算變成0110,則把原數做右邊的1變成0.迴圈往復直到全為0結束。
**如下:
#include
using
namespace std;
intmain()
count = count %
100000;}
cout << count << endl;
return0;
}
但是我們會發現,上面的**在運算過程,會進行很多重複運算,我們明明可以對這些數字進行記憶化,在運算過程中,之前算過的數,我們就不要算了,所以我們可以用dp
**如下:
#include
using
namespace std;
const
int n =
100000010
;const
int mod =
100000
;int dp[n]
;int
main()
cout << sum << endl;
return0;
}
1318 非法二進位制數(dp)
如果乙個二進位制數包含連續的兩個1,我們就稱這個二進位制數是非法的。小hi想知道在所有 n 位二進位制數 一共有2n 個 中,非法二進位制數有多少個。例如對於 n 3,有 011,110,111 三個非法二進位制數。由於結果可能很大,你只需要輸出模109 7的餘數。乙個整數 n 1 n 100 n ...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
統計二進位制數中有幾個1
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位製表中1的個數。例如,把9表示成二進位制是1001,有兩位是1,因此,如果輸入9,則該函式輸出2。下面給出四種演算法 1.基本思路是判斷二進位制中最右邊一位是不是1 接著右移一位,此時右邊數起的第二位被移到了最右邊,再判斷是不是1 這樣每次移動一位,...