pat basic 1103 score du destin

La fraction dite du destin fait référence à une paire d'entiers positifs a et b, où la différence cubique de a et de son petit frère a−1 est exactement le carré d'un autre entier c, et c est exactement la somme des carrés de b. et son petit frère b−1 . Par exemple, 8^3−7^3=169=13^2 et 13=3^2+2^2, donc 8 et 3 sont une paire de fractions de destin.

Étant donné l’intervalle [m,n] où se trouve a, existe-t-il un score de destin ?

Format d'entrée :

Entrez les deux extrémités de l'intervalle donné 0<m<n≤25000, séparées par des espaces.

Format de sortie:

Selon l'ordre de petit à grand, chaque ligne génère une paire de scores de destin et les nombres sont séparés par des espaces. S'il n'y a pas de solution, affichez-la No Solution.

Exemple de saisie 1 :

8 200

Échantillon de sortie 1 :

8 3
105 10

Exemple de saisie 2 :

9 100

Exemple de sortie 2 :

No Solution

Idées de résolution de problèmes :

Avant d'écrire le code, vous pouvez simplifier la formule à la main, afin qu'elle soit plus pratique à utiliser dans le code. Si vous calculez directement le cube de a, 25000^3 provoquera un débordement int. Après l'avoir réduit au carré, le la valeur maximale de la formule est supérieure à 1,8 milliard. , int est encore suffisant.

une^3 - (une-1)^3 = 3*une*une - 3*une + 1

b^2 + (b-1)^2 = 2*b*b - 2*b + 1

La clé est de trouver le nombre du milieu qui fait que a et b sont destinés. Pour a, c'est la différence cubique de a et a-1, et pour b, c'est la somme des carrés de b et b-1 puis au carré . a est parcouru de m à n, b est essayé un par un de petit à grand, et leurs nombres du milieu sont comparés. S'ils sont égaux, le sort est trouvé et peut être affiché. Si le nombre du milieu de b est plus grand que le numéro du milieu de a, vous pouvez quitter le numéro intérieur. Il n'est plus nécessaire de chercher des boucles de calque.

Il y a un autre petit problème à noter : 1 et 1 ne comptent pas en eux-mêmes comme des points de destin. Cette situation doit être exclue, sinon le point de test 4 sera renversé.

#include <stdio.h>

int main(int argc, const char *argv[]) {
	int a, b, m, n, begin, a_num, b_num, flag;
	if ( scanf("%d %d", &m, &n)==EOF ) printf("error\n");

	begin = 2;
	for ( flag=0, a=m; a<=n; ++a ) {
		a_num = 3*a*a - 3*a + 1;
		b = begin;
		do {
			b_num = (2*b*b - 2*b + 1) * (2*b*b - 2*b + 1);
			if ( a_num == b_num ) {
				printf("%d %d\n", a, b);
				flag = 1;
				begin = b;
				break;
			}
			++b;
		} while ( b_num < a_num);
	}
	if ( !flag ) printf("No Solution\n");

	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/herbertyellow/article/details/126694649
Recomendado
Clasificación