我们知道整数是可以用整数加分数的形式表示的,例如5=3+9562/4781=3+9712/4856=3+2956/1478=3+9172/4586=2+9762/3254等等
其中1~9只在前4种的整数部分和分子分母出现且只出现一次,我们求这样的式子的个数即test(x),其中65535>x>0,例如test(5)=4。
输入描述:
输入的第一行是一个整数N<10000,表示数据组数,接下来N行,每行包含一个正整数x。
输出描述:
对于每个x,输出test(x)。
输入样例:
3
5
123
321
样例输出:
4
3
7
思路:
1. 1-9全排列共有362880种可能,对每个排列进行分析,根据第一个加数不超过6位数,分子位数一定会大于分母进行分析(假设顺序为加数,分子,分母)
并定义一个int数组 int a[65536]={0};
2.如1,2,3,4,5,6,7,8,9这种排列。可能存在情况为
加数1,分子2345,分母6789
加数1,分子23456, 分母789
加数1 分子234567, 分母 89
加数1 分子2345678, 分母9
加数12,分子3456, 分母789
加数12,分子34567, 分母89
加数12 ,分子345678, 分母9
加数123,分子456, 分母789
加数123,分子4567, 分母89
加数123,分子45678, 分母9
加数1234,分子567, 分母89
加数1234,分子5678,分母9
加数12345,分子67,分母89
加数12345,分子678,分母9
加数123456,分子78,分母9
加数用for(int i=0;i<6;i++)循环依次得出,然后再根据分子的位数要大于分母的位数,得出分子跟分母可能出现的值。
接着,用分子%分母,如果无余数,则sum=加数+分子/分母,判断其是否小于65535,小于,则a[sum]++;即发现了sum的一种组合。
3.使用头文件<algorithm>下的next_permutation函数,可以依次遍历全排列。