ブルーブリッジカップ]リアル試験トレーニング2014C ++ Aグループ質問3魔法の公式

魔法の公式

 

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;
}

 

おすすめ

転載: blog.csdn.net/weixin_44566432/article/details/115196879