任务:输入一个整数 n
,求大于等于 0
小于 10
的 n
次方的各位数字都不同的数字的个数,写程序求解,要求使用 class
类。部分代码已给出,请将代码填补完整。例如:输入 n=2
,输出 91。
使用方法:动态内存分配;遍历数组;
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
class Solution
{
public:
int countNumbersWithUniqueDigits(int n)
{
if (n == 0) { return 1; }//0
if (n == 1) { return 10; }//0到9
int max = pow(10, n) > 9876543211 ? 9876543211 : pow(10, n);
int i = 0;
for (int num = max; num != 0; i++) { num /= 10; } int digit = i;//算出max有多少位
int* ptr = new int[digit]();//建立一个数组,每个元素储存一位数的数字,并将数组元素全部初始化为0
//外层循环是一个一个数的找,内层循环是一位数一位数的存
int count(11);//至少包括0到10
for (int j = 11; j < max; j++) {//每一个数
int num(j);
for (int k = digit - 1; num != 0; k--) {//是从数组的最后一个元素开始倒着存的
ptr[k] = num % 10;
num /= 10;
}
//循环完成之后,得到一个数组,存了要找的数的所有位的数字
int ones(0), twos(0), threes(0), fours(0), fives(0), sixes(0), sevens(0), eights(0), nines(0), zeroes(0);
for (int m = 0; m < digit; m++) {//正着开始找
if (m == 0) {while (ptr[m] == 0) m++;}//从第一个不是零的位数开始找,只有第一次才判断
switch (ptr[m])
{
case 0: zeroes++; break;
case 1: ones++; break;
case 2: twos++; break;
case 3: threes++; break;
case 4: fours++; break;
case 5: fives++; break;
case 6: sixes++; break;
case 7: sevens++; break;
case 8: eights++; break;
case 9: nines++; break;
default:
break;
}
}//找完了所有元素,得到所有数字的个数
if (
zeroes <= 1 && ones <=1 && twos <= 1 && threes <= 1 && fours <= 1 && fives <= 1 && sixes <= 1 && sevens <= 1 && eights <= 1 && nines <= 1
) count++;//所有的数字都小于等于1个,则符合要求
}
return count;
}
};//n = 2, digit = 3, ptr[2] = 1, ptr[1] = 1; ptr[0]=[0]
int main()
{
Solution s;
int n;
cin >> n;
cout << s.countNumbersWithUniqueDigits(n);
return 0;
}
由于有多层嵌套的循环,容易出错。