问题:
192这个数很厉害,用它分别乘以1、2、3,会得到:
192 x 1 = 192
192 x 2 = 384
192 x 3 = 576
把这三个乘积连起来,得到192384576,正好是一个1~9的全排列
我们把上面的运算定义为连接乘积:
m x (1 … n) = k(其中m > 0 且 n > 1,对于上例,m = 192、n = 3、k = 192384576)
即k是把m分别乘以1到n的乘积连接起来得到的,则称k为m和n的连接乘积。
按字典序输出所有不同的连接乘积k,满足k是1~9的全排列。
解决:由题意大致推出,0
#include
#include
#include
#include
#include
#include
using namespace std;
vector<string> Str3;
bool NoRepeat(char str[]);
int main()
{
char str1[5]; //临时保存乘之后的结果数字;
char str2[20]; //将临时的数字连接在一起;
memset(str1, 0, sizeof(str1));
memset(str2, 0, sizeof(str2));
int i, j;
for(i = 1; i<9999; i++)
{
for(j = 1; j<10; j++)
{
itoa(i*j, str1, 10);
strcat(str2, str1);
if(strlen(str2)>9)
{
memset(str2, 0, sizeof(str2));
break;
}
if(strlen(str2)==9)
{
if(NoRepeat(str2))
{
Str3.push_back(str2);
memset(str2, 0, sizeof(str2));
break;
}
}
}
}
sort(Str3.begin(),Str3.end()); //排序
for(i=0; i<Str3.size(); i++)
cout<<Str3[i]<<endl;
return 0;
}
bool NoRepeat(char str[]) //判断重复及0。
{
int i = 0;
int j = 0;
int flag = true;
for(i = 0; i<8; i++)
{
for(j = i+1; j<9; j++)
{
if(str[i]==str[j])
{
flag = false;
break;
}
}
if(flag ==false)
{
break;
}
}
if(flag==true)
{
for(i = 0; i<9; i++)
{
if(str[i]=='0')
{
flag = false;
break;
}
}
}
return flag ;
}