魔法の公式
4つの異なる数で構成される乗算式であり、それらの積は依然としてこれらの4つの数で構成されています。
といった:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
が要件を満たしています。可換乗算の法則を満たす方程式を同じ状況として数える場合、上記の3つの状況を含めて、要件を満たすためにいくつの種類の方程式がありますか?
番号を入力し、ブラウザから回答を送信してください。余分なコンテンツは入力しないでください(例:すべての計算を一覧表示します)。
回答:12
問題分析
この問題も以前に同様の問題に遭遇しました。解決策は暴力的な列挙である可能性があり、方法も同様であり、満たされたすべての数式を列挙します。ここでの状況は、3桁* 2桁、または2桁に2桁を掛けたものである可能性があるため、直接列挙すると、間違いなく数式が重複することに注意してください。だからあなたは判断する必要があります!!!
2桁* 2桁の式を判断して、2桁の数字が繰り返されないようにします。方法は、前の数字が後ろの数字よりも小さいか、後ろの数字が前の数字よりも小さいかのいずれかです。 2の。
#include <iostream>
#include <unordered_set>
#include <string.h>
#include <sstream>
#include <algorithm>
using namespace std;
int ans=0;
bool check(int res, int x){
stringstream ss;
string str_res, str_x;
ss << res;
ss >> str_res;
stringstream ss1; //重新申请ss,注意 !
ss1 << x;
ss1 >> str_x;
sort(str_res.begin(), str_res.end());
sort(str_x.begin(), str_x.end());
if (str_res == str_x){
return true;
} else{
return false;
}
}
int main(int argc, 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 res = i*1000 + j*100 + k*10 + l;
int r1 = i*(j*100 + k*10 + l); //三位数*一位数
if(check(res, r1)){
ans ++;
}
int r2 = (i*10+j) * (k*10+l); //两位数*两位数
if( (i*10+j) < (k*10+l) && check(res, r2)){
//注意对两个两位数的大小进行判断,(i*10+j) < (k*10+l),不然会重复
ans++;
}
}
}
}
}
}
}
}
cout << ans << endl;
return 0;
}