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示例
12output示例 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...