Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

Problema matematico in c

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

Problema matematico in c

Messaggioda TheHacker66 » sab ott 24, 2009 5:12 pm

Ciao ragazzi, sono qui per chiedervi aiuto su come poter risolvere un problema matematico da tradurre in c. Eccolo:

Scrivere un programma C in grado di restituire il piu' piccolo numero naturale che rispetti le seguenti condizioni:

1. Il numero è l'area di un rettangolo caratterizzato da lati e diagonale di lunghezza intera (Ad esempio 12 e' uguale all'area di un rettangolo che ha per lati 3 e 4 e per diagonale 5).

2. Il numero è uguale al prodotto di quattro numeri consecutivi diviso quattro (Ad esempio 6 e' uguale al prodotto di 1, 2, 3 e 4 diviso per 4).

Ho capito che ho bisogno di un ciclo (o due) while per inserire le mie 2 condizioni, in modo tale da far continuare il programma solo nel caso specifico, però mi sono fermato lì.. C'è qualcuno che potrebbe illuminarmi (senza scrivermi la soluzione, ma solo aiutandomi a ragionare?

PS. Per ora ho fatto If - Else - While - For - Scanf - Printf e gli Array, quindi devo creare un programma solo con questi.
Grazie
RICORDATE: GOOGLARE NON E' UN REATO! E NON LO E' NEANCHE CERCARE SUL FORUM PRIMA DI POSTARE!
Avatar utente
TheHacker66
Bronze Member
Bronze Member
 
Messaggi: 806
Iscritto il: dom nov 19, 2006 8:22 pm
Località: Milano

Re: Problema matematico in c

Messaggioda M@ttia » sab ott 24, 2009 6:30 pm

Allora, sia il numero che cerchiamo n.

La seconda condizione si può tradurre in: n = k * (k+1) * (k+2) * (k+3) / 4; quindi il primo ciclo sarà for k=1,2,3,4,5,... e ci genererà quell'n.
Dobbiamo ancora verificare se quell'n soddisfa la prima condizione (che altro non è che dire che "n/2 è l'area di un triangolo rettangolo, i cui lati formano una terna pitagorica: a^2+b^2=c^2, ovvero n = a*b che soddisfano la relazione qui a sinistra per a,b,c interi). Basterà quindi fare un ciclo for a=1,2,3,...,n/2 (o addirittura n/4) dove verifichiamo se a è un divisore di n/2, definiamo b= n/(2a) e testiamo se a^2+b^2 è intero.

Vuoi anche il codice?
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero

Re: Problema matematico in c

Messaggioda TheHacker66 » sab ott 24, 2009 6:45 pm

Io avevo pensato a una cosa del genere:

Codice: Seleziona tutto
#include <stdio.h>

int main()

{
    int a=0;
    int b=0;
    unsigned int c;
    int n=0;
    {
          for(a=0; a<100; a++)
          for(b=0; b<100; b++)
          for(n=0; n<100; n++)
          while(a*b/2==c) && (n*(n+1)*(n+2)*(n+3)/4==c)
          printf("il numero richiesto è: %d", c)
          }
          }
         


Lo sò che è totalmente sbagliato, però mi serve per spiegare come ho pensato la cosa: con il while impongo le condizioni, poi con i cicli for faccio assegnare a ogni variabile un valore dell'array da 1 a 99, sennò non sò da dove pescare i numeri da fargli provare..
RICORDATE: GOOGLARE NON E' UN REATO! E NON LO E' NEANCHE CERCARE SUL FORUM PRIMA DI POSTARE!
Avatar utente
TheHacker66
Bronze Member
Bronze Member
 
Messaggi: 806
Iscritto il: dom nov 19, 2006 8:22 pm
Località: Milano


Re: Problema matematico in c

Messaggioda M@ttia » sab ott 24, 2009 7:02 pm

Ti propongo il mio codice: cerca di vedere se riesci a capirlo (si ferma al più piccolo che trova, ma altrimenti andrebbe avanti a trovarne quanti ne vuoi).

Codice: Seleziona tutto
#include<iostream>
#include<cmath>

int main()
{

  // Questo for rispecchia la seconda condizione e ci fa passare solo gli n multipli di 4 numeri consecutivi
  for(unsigned int k=1; ; ++k)
  {
     unsigned int n = k*(k+1)*(k+2)*(k+3) / 4;
     // Nota che k*(k+1)*(k+2)*(k+3) è chiaramente sempre divisibile per 4, quindi n è intero

    // Ora verifichiamo se esiste a,b,c terna pitagorica con n=a*b
    unsigned int a_max = round(n/2);
    for(unsigned int a = 1; a < a_max; ++a)
    {
      if(n%a != 0) continue;     // ci interessano solo i divisori di n, quindi i "candidati" per il lato 'a' del rettangolo
      unsigned int b = n/a;      // poiché a*b=n
      unsigned int c2 = a*a+b*b; // c^2
     
      // Resta da verificare che c=radice(c^2) sia intero
      unsigned int r = round(std::sqrt(double(c2)));
      if(r*r==c2)
      {
        std::cout << "Il numero cercato è n=" << n << ", con n = "
                  << a << " x " << b << " (diagonale = " << r << ") e 4n = "
                  << k << " * " << k+1 << " * " << k+2 << " * " << k+3 << ".\n";
        return 0;
      }

    }

  }
   
  return -1; // Non dovrebbe mai arrivare qui...
}


L'output generato è (togliendo il return 0 e lasciandolo andare avanti per trovarne alcuni altri):
Il numero cercato è n=420, con n = 12 x 35 (diagonale = 37) e 4n = 5 * 6 * 7 * 8.
Il numero cercato è n=1260, con n = 28 x 45 (diagonale = 53) e 4n = 7 * 8 * 9 * 10
Il numero cercato è n=1980, con n = 20 x 99 (diagonale = 101) e 4n = 8 * 9 * 10 * 11.
Il numero cercato è n=14280, con n = 119 x 120 (diagonale = 169) e 4n = 14 * 15 * 16 * 17.
Il numero cercato è n=215760, con n = 120 x 1798 (diagonale = 1802) e 4n = 29 * 30 * 31 * 32.
ecc...

Il tutto in circa un secondo di tempo di esecuzione [^]
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero

Re: Problema matematico in c

Messaggioda TheHacker66 » sab ott 24, 2009 7:13 pm

A me dà errore di compilazione.. Poi in quel codice ci sono funzioni che non ho ancora fatto, si riuscirebbe a fare la stessa cosa con If - Else - While - For - Scanf - Printf ?
RICORDATE: GOOGLARE NON E' UN REATO! E NON LO E' NEANCHE CERCARE SUL FORUM PRIMA DI POSTARE!
Avatar utente
TheHacker66
Bronze Member
Bronze Member
 
Messaggi: 806
Iscritto il: dom nov 19, 2006 8:22 pm
Località: Milano

Re: Problema matematico in c

Messaggioda M@ttia » sab ott 24, 2009 7:18 pm

A me compila correttamente (sia sotto Linux che Windows, e anche guardando il codice deve compilarlo perché è davvero semplice vedere che non c'è nulla di sbagliato).

Ho usato solo ed esclusivamente FOR e IF [quelli che magari non capisci sono std::cout che serve a stampare a schermo (tu usi printf()), round() che arrotonda un numero all'intero più vicino (ed è necessario) e std::sqrt() che non è altro che la radice quadrata di un numero...]
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero

Re: Problema matematico in c

Messaggioda TheHacker66 » sab ott 24, 2009 7:33 pm

Scusa Tia se ti rompo.. Il motivo per cui non compilava è perché è in C++, a me servirebbe scritto in C..
RICORDATE: GOOGLARE NON E' UN REATO! E NON LO E' NEANCHE CERCARE SUL FORUM PRIMA DI POSTARE!
Avatar utente
TheHacker66
Bronze Member
Bronze Member
 
Messaggi: 806
Iscritto il: dom nov 19, 2006 8:22 pm
Località: Milano

Re: Problema matematico in c

Messaggioda M@ttia » sab ott 24, 2009 7:39 pm

Beh ok, allora negli include usa <stdio.h> invece di <iostream> e <math.h> invece di <cmath>, poi cambia quelle due cosette di conseguenza (printf invece di cout, sqrt invece di std::sqrt, round).
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero

Re: Problema matematico in c

Messaggioda TheHacker66 » sab ott 24, 2009 7:52 pm

Perfetto! Grazie Mille!!
RICORDATE: GOOGLARE NON E' UN REATO! E NON LO E' NEANCHE CERCARE SUL FORUM PRIMA DI POSTARE!
Avatar utente
TheHacker66
Bronze Member
Bronze Member
 
Messaggi: 806
Iscritto il: dom nov 19, 2006 8:22 pm
Località: Milano


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising