51nod 1009 數字1的數量

2021-07-23 22:49:46 字數 1418 閱讀 9318

1009 數字1的數量

基準時間限制:1 秒 空間限制:131072 kb 分值: 5 

難度:1級演算法題

給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。

例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。

input

輸入n(1 <= n <= 10^9)
output

輸出包含1的個數
input示例

12
output示例 5

one

介紹一下這個演算法的本質

147 相當於 百位為1時有多少個數,百位為0時,47含有多少個含有1的數(相當於

算100-147) 再加上1-99有多少個 1 

47 把個位上的7看成1,十位4有5種變化(0,1,2,3,4)有,5個1,分別是01,11,21,31,41

把十位的 4看成1,個位有10種變化形式(0-9),總共有10+5=15

#include#include#include#define ll long long

ll dp[20];

void init()

ll solver(ll n)

else if(tn>1)

result+=temp+tn*dp[len-1];//temp代表著當temp=1時,有多少種

rail+=tn*temp;

temp*=10;

} return result;

} int main()

return 0;

}

two本來用動態規劃寫的,寫了半天,結果悲劇了,看了同學的**,我來解釋一下

其本質就是一位一位的進行分析  舉例說明一下 

40613 

我們從個位開始分析

個位 3>1  前面有 我們就把個位看成 1 那其那面的4位從1-4061有4061種變化再加上

前4位全部為 0 有1種變化 總共有  4062 種變化

十位 1==1  前3位從 0-405有406*10  前3位位406時有 3+1 種變化,共406*10+3+1 

百位  6>1 我們把百位看成 1 後面2位就有100變化 前2位有41種變化(前三位可以全部

是0) 41*100

千位 0,4*1000 

萬位4>1,看成 1,有1*10000種變化

#includeint main()

else

ans=ans+(n/(temp*10)+1)*temp;

temp*=10;

tn/=10;

} printf("%d\n",ans);

} }

51nod 1009 數字1的數量

1009 數字1的數量 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 收藏 關注 給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。例如 n 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。input ...

51 nod 1009 數字1的數量

1009 數字1的數量 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 收藏 關注 給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。例如 n 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。input ...

51nod 1009 數字1的數量

1009 數字1的數量 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法 給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。例如 n 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。input 輸入n 1 n...