PDA

Visualizza la versione completa : [C] Lista numeri scomponibili in somma di due quadrati


Satiro88
20-10-2013, 16:12
Ciao a tutti come da titolo dovrei fare un programma,sicuramente banale e spero non offensivo per voi, che,dato un certo numero n inserito da tastiera,vada a controllare che ogni numero da 1 ad n possa essere scomposto come somma di quadrati,una volta stabilito ciò bisogna stampare la lista dei numeri che effettivamente possono essere riscritti come somma di due quadrati.

Per esempio, se n=8
avremo:
2=1^2 + 1^2
5=1^2 + 2^2
8=2^2 + 2^2

In effetti il programmino,per come l'ho scritto,sembra funzionare,l'unica cosa,un pò fastidiosa è il fatto che ignori la proprietà commutativa,quindi mi scrive due volte il 5 per esempio.Sapete come evitare queste ripetizioni senza dover usare controlli tra array o cose del genere?

(tra l'altro ciò non si verifica per il primo e l'ultimo valore,immagino perchè entrambi partano da 1 a ciclare e c'è un solo caso in cui entrambi sono a 1 per esempio)


#include <stdio.h>
#include <stdlib.h>


/* ->VARIANTE<-
SCRIVERE UN PROGRAMMA CHE LEGGE UN INTERO POSITIVO N E STAMPA LA SEQUENZA DI TUTTI I NUMERI SCOMPONIBILI COME SOMMA DI DUE QUADRATI*/


// primoA=primo Addendo secondoA=secondo Addendo



int main()
{
int a,primoA,secondoA,tot,n;

printf("\n inserisci numero\n\n");
scanf("%d",&n);

for(int z=1;z<=n;z++)
{
a=z;
for(int i=1;i<=a;i++)
{
primoA=i*i;
for(int j=1;j<=a;j++)
{
secondoA=j*j;
tot=primoA+secondoA;
if(tot==a)
{

printf("\n%d = [ %d^2 + %d^2 ]\n",z,i,j);

}
}

}
}

system ("pause");
return 0;
}




Grazie mille.

Dennis
20-10-2013, 18:06
Ciao,

una soluzione semplice: potresti utilizzare un flag che attivi quando hai trovato la combinazione valida. Tale flag lo potresti poi controllare per uscire dal ciclo, perché tanto non ti interessa continuare per quel numero, giusto?

(vedi parte codice in grassetto)



Ciao a tutti come da titolo dovrei fare un programma,sicuramente banale e spero non offensivo per voi, che,dato un certo numero n inserito da tastiera,vada a controllare che ogni numero da 1 ad n possa essere scomposto come somma di quadrati,una volta stabilito ciò bisogna stampare la lista dei numeri che effettivamente possono essere riscritti come somma di due quadrati.

Per esempio, se n=8
avremo:
2=1^2 + 1^2
5=1^2 + 2^2
8=2^2 + 2^2

In effetti il programmino,per come l'ho scritto,sembra funzionare,l'unica cosa,un pò fastidiosa è il fatto che ignori la proprietà commutativa,quindi mi scrive due volte il 5 per esempio.Sapete come evitare queste ripetizioni senza dover usare controlli tra array o cose del genere?

(tra l'altro ciò non si verifica per il primo e l'ultimo valore,immagino perchè entrambi partano da 1 a ciclare e c'è un solo caso in cui entrambi sono a 1 per esempio)


#include <stdio.h>
#include <stdlib.h>


/* ->VARIANTE<-
SCRIVERE UN PROGRAMMA CHE LEGGE UN INTERO POSITIVO N E STAMPA LA SEQUENZA DI TUTTI I NUMERI SCOMPONIBILI COME SOMMA DI DUE QUADRATI*/


// primoA=primo Addendo secondoA=secondo Addendo



int main()
{
int a,primoA,secondoA,tot,n,found;

printf("\n inserisci numero\n\n");
scanf("%d",&n);

for(int z=1;z<=n;z++)
{
a=z;
found=0;
for(int i=1;i<=a;i++)
{
if(found==1)break;
primoA=i*i;
for(int j=1;j<=a;j++)
{
if(found==1)break;
secondoA=j*j;
tot=primoA+secondoA;
if(tot==a)
{

printf("\n%d = [ %d^2 + %d^2 ]\n",z,i,j);
found=1;

}
}

}
}

system ("pause");
return 0;
}




Grazie mille.

Satiro88
21-10-2013, 18:42
Ciao,

una soluzione semplice: potresti utilizzare un flag che attivi quando hai trovato la combinazione valida. Tale flag lo potresti poi controllare per uscire dal ciclo, perché tanto non ti interessa continuare per quel numero, giusto?

(vedi parte codice in grassetto)


Grazie,stavo pensando anche io a qualcosa di simile anche se i break non piacciono molto al docente XD,grazie ancora ciao!

Loading