题目:
给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10的n次方。
示例:
输入: 2
输出: 91
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字
推导:
- 当n为0时候,只有0这一个数字,所以sum=1;
- 当n为1时候,范围为[0,10),所以sum等于10;
- 当n为2的时候,范围为[0,100),所以sum是[0,10)范围内的sum,加上[10,100)范围内,位数是2的sum,
- 以此类推,假设dp[i]为位数为i的各个位上数字不同的数字个数,则dp[i+1]=dp[i]+9 * (10-(i-1)) * (10-(i-2)) * … * (10-(i-(i-2))) * (10-(i-(i-1)));
代码:
#include <iostream>
#include <vector>
using namespace std;
int countNumbersWithUniqueDigits(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return 9;
}
vector<int> dp;
dp.push_back(0);
dp.push_back(10);
for (int i = 2; i <= n; i++) {
int sum = 9;
for (int j = 1; j <= n - 1; j++) {
sum *= (10 - j);
}
dp.push_back(dp[i - 1]+sum);
}
return dp[n];
}
int main() {
int n;
cin >> n;
cout << countNumbersWithUniqueDigits(n) << endl;
return 0;
}