1-9这9个数字组成并且都只出现一次 ,第一位能被1整除,前两位能被2整除

1-9这9个数字组成并且都只出现一次,这个九位数的第一位能被1整除,前两位能被2整除,前三位能被3整除...前九位能被9整除.

解题需要注意的地方:

1.设置全局数组实现回溯;

2.在每一次调用里再次for循环,实现对每个位置每个数字的枚举。

#include<iostream>
#include<vector>
using namespace std;
bool used[10];
vector<long long> v;
void dfs(int k,long long a)
{
	if(k && a%k != 0)
		return;
	if(9 == k)
	{
		v.push_back(a);
		return ;
	}
	for(int i = 1;i <= 9;i++)
	{
		if(!used[i])
		{
			used[i] = 1;
			dfs(k+1,a*10+i);
			used[i] = 0;
		}
	}
}
int main()
{
	dfs(0,0);
	for(int i = 0;i < v.size();++i)
		cout << v[i] << endl;
	
}


这个问题可以使用排列组合的方法进行计算。首先,我们需要确定这个8位数中哪些数字是可以使用的,因为题目规定了只能使用0-7这8个数字,并且不能有重复数字,所以这个数字可以使用的数字就是{0,1,2,3,4,5,6,7}中取出8个数字的排列数,即8的全排列,即8! = 40320。 接下来,我们需要确定满足条件的8位数中有哪些数字可以放在第一位,因为对于一个8位数,它能否被11整除取决于它的偶数位数字之和与奇数位数字之和的差是否为11的倍数。因此,我们可以将这个8位数按照奇偶位分为两部分,分别计算它们的数字之和,然后计算它们之差是否为11的倍数。由于这个8位数中没有重复数字,所以它的偶数位数字之和与奇数位数字之和的差的绝对值为8,因此我们只需要确定奇数位数字之和与偶数位数字之和的差是11的倍数还是11的倍数加上11即可。 对于奇数位数字之和与偶数位数字之和的差是11的倍数的情况,我们可以将数字1和数字6放在奇数位,将数字0、2、3、4、5、7放在偶数位,然后计算它们的排列数,即6! / 2! = 360。因为数字1和数字6可以互换位置,所以需要除以2。 对于奇数位数字之和与偶数位数字之和的差是11的倍数加上11的情况,我们可以将数字3和数字7放在奇数位,将数字0、1、2、4、5、6放在偶数位,然后计算它们的排列数,即6! / 2! = 360。因为数字3和数字7可以互换位置,所以需要除以2。 因此,满足条件的8位数的总数为360 + 360 = 720。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值