[ブルーブリッジカップ]試験トレーニング2013C ++ Aグループ質問2平方数を除く

専用広場 

タイトル:平方数
を除くシャオミンは、203879番をぼんやりと見つめています。
203879 * 203879 = 41566646641
です。魔法とは何ですか?注意深く観察してください。203879
は6桁の数字であり、各桁の数字は異なり、2乗した後のすべての数字がそれを形成しているようには見えません。 。自分の数字。
そのような特徴を持つ6桁の数字が他にもあります。見つけてください!

回答:639172

問題分析

暴力的な列挙

暴力的な列挙方法は、6桁のループで構成されており、条件により、6桁の各桁が異なり、最後の四角で得られる数に独自の数が含まれていないことを確認してください。

2つの6桁の数値を乗算して得られる数値は非常に大きく、intの範囲を超えているため、エラーを回避するために、長い長い大きな数値を使用してそれらを格納することをお勧めします。将来的には、同様の問題が多数発生する可能性があります。longlongを使用する方が安全です。これは、値の範囲の判断でもあります。

ここでは、整数を文字列に変換するために便利な関数を使用しています

#include <iostream>
#include <sstream>
using namespace std;

//t2:排它平方数 

//整数转成字符串 
void i2s(long long x, string &basic_string){
	stringstream ss;
	ss << x;
	ss >> basic_string; 
}
 
//判断xx是否包含x中的数字 
bool check(long long x, long long xx){
	string s_x, s_xx;
	i2s(x, s_x);
	i2s(xx, s_xx);
	
	for(int i = 0; i < s_x.length(); i++){
		if(s_xx.find(s_x[i]) != string::npos){
			return false;
		}
	}
	return true; 
}

int main(int argc, char** argv) {
	for(int i = 1; i < 10; i++){
		for(int j = 0; j < 10; j ++){
			if(j != i){
				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){
								for(int h = 0; h < 10; h ++){
									if( h != i && h != j && h != k && h != l){
									for(int m = 0; m < 10; m ++){
										if( m != h && m != i && m != j && m != k && m != l){
											long long num = i*100000 + j*10000 + k*1000 + l*100 + h*10 + m;
											if(check(num, num*num)){
												cout << num << " " << num*num << endl;:
											}
										}
									} 
								}
							}
						}}
					}
				}
			}
		}
	} 
	
	return 0;
}

 

この質問では、まだ暴力的な解決策ですが、直接解決することはできません。コンピュータ計算を利用します。このような問題については、目標を明確にし、アイデアに従って段階的に記述します。コード難しいことではありません。高すぎると、いつでも結果を得ることができます。

おすすめ

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