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