[Blue Bridge Cup] Treinamento para o exame 2013 C ++ A Pergunta do grupo 2, excluindo o número do quadrado

Quadrado exclusivo 

Título:
Excluindo o Número Quadrado Xiao Ming está olhando para o número 203879 atordoado.
Acontece que 203879 * 203879 = 41566646641.
Qual é a mágica? Observe com atenção, 203879
é um número de 6 dígitos, e o número em cada dígito dele é diferente, e todos os dígitos depois dele ao quadrado não parecem formá-lo . Próprios números.
Existe outro número de 6 dígitos com essas características. Encontre-o!

Resposta: 639172

Analise de problemas

Enumeração violenta

O método de enumeração violenta é composto por seis dígitos em loop. De acordo com as condições, cada dígito dos seis dígitos é diferente e o número obtido pelo quadrado final não contém o seu próprio número. Verifique então esta condição.

Deve-se notar que o número obtido pela multiplicação de dois números de seis dígitos é muito grande, excedendo a faixa de int, então é melhor usar números longos longos para armazená-los para evitar erros. No futuro, você encontrará problemas semelhantes com números grandes. É mais seguro usar muito longo. Isso também é um julgamento sobre a faixa de valores.

Uma função útil é usada aqui para converter um inteiro em uma string

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

 

Nesta questão, embora ainda seja uma solução violenta, é impossível resolvê-la diretamente. Aí aproveita os cálculos do computador. Para este tipo de problema, esclareça o seu objetivo e escreva-o passo a passo de acordo com a ideia. O código não é difícil. Se for muito alto, você sempre poderá obter resultados.

Acho que você gosta

Origin blog.csdn.net/weixin_44566432/article/details/115086587
Recomendado
Clasificación