首先乘积和两个乘数的位数之和为9,由此可以推出乘积的位数应该在4位或5位,因此乘积>98765(有不重复数字的要求)的情况直接跳过。 而灵活运用set、tuple、tie可以便捷存储以及打印
同时要注意set中存放排列式的顺序,这里set是按照每个tuple中第一个元素的大小升序排列的(自动)
代码1:
#include<bits/stdc++.h>
using namespace std;
bool isValid(int a,int b)
{
int product = a*b;
string s1 = to_string(a) + to_string(b) + to_string(product);
if(s1.length()!=9)return false;
sort(s1.begin(),s1.end());
return s1 == "123456789";
}
int main()
{
set<tuple<int,int,int>> x;
for (int i=1;i<10000;i++)
{
for(int j=i;j<10000;j++)
{
int product = i*j;
if(product>98765)
break;
if(isValid(i, j))
x.insert({product,i,j});
}
}
for(const auto& m:x)
{
int product,a,b;
tie(product,a,b) = m;
cout<<product<<" = "<<a<<" x "<<b<<endl;
}
return 0;
}
代码二
#include<bits/stdc++.h>
using namespace std;
bool comp(int x,int y){
int product = x*y;
string s1 = to_string(x) + to_string(y) + to_string(product);
if(s1.length()!=9)
return false;
else{
sort(s1.begin(),s1.end(),less<char>());//默认从小到大排序
if(s1=="123456789")
return true;
else
return false;
}
}
int main(){
vector<tuple<int,int,int>> v1;
for(int i=1;i<100;i++)
{
for(int j=i+1;j<10000;j++)
{
if(comp(i,j))
v1.push_back(make_tuple(i*j,i,j));
}
}
sort(v1.begin(),v1.end());
for(int num=0;num<v1.size();num++){
int product,x,y;
tie(product,x,y) = v1[num];
cout<<product<<" = "<<x<<" x "<<y<<endl;
}
return 0;
}