C++:求各位数字都不同的数字的个数

任务:输入一个整数 n,求大于等于 0 小于 10n 次方的各位数字都不同的数字的个数,写程序求解,要求使用 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;
}

由于有多层嵌套的循环,容易出错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值