题目链接:
思路:暴力枚举每一个全排列,判断当前全排列是否为一个连接乘积。
超时,不过可以先在本地上跑出来,直接提交答案嘛,嘿嘿嘿。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
do {
ll sum = 0;
for(int i = 0; i < 9; ++i) sum = sum * 10 + a[i];
ll t = 0;
bool flag = false; // 判断当前全排列是否为连接乘积
for(int i = 0; i < 9; ++i)
{
t = t * 10 + a[i]; // 依次枚举当前全排列的前几位数t
if(t == sum) break;
ll s = 0; //求t的连接乘积
for(int j = 1; (int)log10(s) + 1 < 9; ++j)
{
ll nxt = t * j;
s = s * pow(10, (int)log10(nxt) + 1) + nxt;
}
if(s == sum)
{
flag = true;
break;
}
}
if(flag)
{
//printf("%d\n", t);
for(int i = 0; i < 9; ++i) printf("%d", a[i]);
printf("\n");
}
}while(next_permutation(a, a + 9));
fclose(stdin);fclose(stdout);
return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
printf("123456789\n192384576\n219438657\n273546819\n327654981\n672913458\n");
printf("679213584\n692713854\n726914538\n729314586\n732914658\n769215384\n");
printf("792315846\n793215864\n918273645\n926718534\n927318546\n932718654\n");
return 0;
}