题目
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
代码
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
bool check(int src, int r);
using namespace std;
int ans;
int main(int argc, const char *argv[]) {
for (int i = 1; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
if (i != j)
for (int k = 0; k < 10; ++k) {
if (k != i && k != j)
for (int l = 0; l < 10; ++l) {
if (l != i && l != j && l != k) {
int src = i * 1000 + j * 100 + k * 10 + l;//ijkl四位数
//验证
if (j != 0) {
int r1 = i * (j * 100 + k * 10 + l);//乘法结果
if (check(src, r1)) {
printf("%d * %d\n", i,j * 100 + k * 10 + l);
ans++;
}
}
//验证
if (k != 0) {
int r2 = (i * 10 + j) * (k * 10 + l);//乘法结果
if ((i * 10 + j)< (k * 10 + l)&&check(src, r2)) {
printf("%d * %d\n", i * 10 + j, k * 10 + l);
ans++;
}
}
}
}
}
}
}
cout << ans << endl;
return 0;
}
bool check(int src, int r) {
// 先转字符串,排序,比较
string src_str, r_str;
stringstream ss;
ss << src;
ss >> src_str;
stringstream ss1;
ss1 << r;
ss1 >> r_str;
sort(r_str.begin(), r_str.end());
sort(src_str.begin(), src_str.end());
if (r_str == src_str) {
return true;
}
return false;
}
简洁代码
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
bool check(int num0,int num)
{
string s1,s2;
stringstream ss0;
ss0<<num0;
ss0>>s1;
stringstream ss1;
ss1<<num;
ss1>>s2;
sort(s1.begin(),s1.end());
sort(s2.begin(),s2.end());
if(s1==s2) return true;
else return false;
}
int main()
{
int ans=0;
for(int a=1;a<10;a++)
{
for(int b=0;b<10;b++)
{
if(b!=a)
{
for(int c=0;c<10;c++)
{
if(c!=a&&c!=b)
{
for(int d=0;d<10;d++)
{
if(d!=a&&d!=b&&d!=c)
{
int num0=a*1000+b*100+c*10+d;
int num1=a*(b*100+c*10+d);
int num2=(a*10+b)*(c*10+d);
if(check(num0,num1))
{
cout<<a<<" * "<<b*100+c*10+d<<" num1="<<num1<<endl;
ans++;
}
if(((a*10+b)<(c*10+d))&&check(num0,num2))
{
cout<<a*10+b<<" * "<<c*10+d<<" num2="<<num2<<endl;
ans++;
}
}
}
}
}
}
}
}
cout<<"ans="<<ans<<endl;
return 0;
}