給定乙個十進位制正整數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
用乙個2維陣列表示從1~以為j開頭的有i位數的數字有多少個1.
狀態轉移方程就是:
j=1: dp[i][j]=dp[i-1][9]*2+pow(10,i-1);
(1,9]: dp[i][j]=dp[i-1][9]+dp[i][j-1];
還有需要注意的是:
從高位到地位:
如果高位為有1的話,我們還要加上高位以下所有數的1的數量即n%pow(10,i-1),
例如12345,從1開始我們統計1~10000中1的總數量,接著我們統計10001~12345中1的數量時,
其實是依次統計1~2000,1~300,1~40,1~5中1的數量,所以,如果高位有1的話,我們需要加上對應的數量的個數。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fir first
#define sec second
#define fin freopen("/home/ostreambaba/文件/input.txt", "r", stdin)
#define fout freopen("/home/ostreambaba/文件/output.txt", "w", stdout)
#define mes(x, m) memset(x, m, sizeof(x))
#define pii pair
#define pll pair
#define inf 1e9+7
#define pi 4.0*atan(1.0)
#define mod 1000000007
#define lowbit(x) (x&(-x))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
double eps = 1e-12;
const
int maxn = 1010;
using
namespace
std;
inline
int read()
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}int dp[10][10];
int num[10];
void init()
else
dp[i][j]+=dp[i-1][9];}}
}int cacl(int t)
return k;
}int main()
}for(int i=k;i>=1;--i)
else
if(1==num[i])
else
}cout
<}
51Nod 1009 數字1的數量 數字dp
51nod 1009 數字1的數量 數字dp 給定乙個十進位制正整數n,寫下從1開始,到n的所有正數,計算出其中出現所有1的個數。例如 n 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。輸入n 1 n 10 9 輸出包含1的個數 1位數的情況 大於等於1的時候,有1個,...
51nod 1009 數字1的數量 數字dp
基礎的數字dp,我不大會。數字dp的ppt 建議先看一下ppt,我是按照ppt裡面差不多的方式寫的,也參考了別人寫的。dp i j 表示長度為i位以j開頭的數字到1 閉區間 之間包含多少1 include include include using namespace std int dp 15 1...
51Nod 1009 數字1的數量 數字dp
給定乙個十進位制正整數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的個數 sample input 12sample output 5...