Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c] realizzare programma che fa sottrazione tra 2 numeri naturali da 20 cifre

    ciao a tutti
    per l'università devo realizzare un programma in c (non in c++ o altro)

    premesso che le mie conoscenze sono molto limitate, il programma deve fare la sottrazione tra due numeri naturali di 20 cifre. o meglio da un numero di massimo 20 cifre ne va sottratto un altro qualsiasi


    ho già realizzato un semplice programma di sottrazione tra due numeri, il problema e' che se inserisco numeri di oltre dieci cifre mi sballa tutto quanto

    come posso fare per risolvere il problema?
    potete aiutarmi ?
    ciao

    Andrea

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non penso che in C (né in alcun altro linguaggio di programmazione) si possano gestire numeri interi di 20 cifre in modo nativo.

    Penso che lo scopo del tuo professore sia quello di farvi lavorare con gli array: carica i numeri di 20 cifre in due array e poi fai la sottrazione posizione a posizione. Non conosco C quindi non posso proporti del codice.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    17
    in c, dikiarano la varibaile come long int.. dovrebbe poter assumere valori compresi tra i seguenti numeri
    Con segno: da −9.223.372.036.854.775.808 a +9.223.372.036.854.775.807
    Senza segno: da 0 a +8.446.744.073.709.551.615
    quindi forse va bene, o no?

  4. #4
    no perché sono 19 cifre e non 20..
    ciao

    Andrea

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usa un array di char per rappresentare il numero ....

  6. #6
    dunque ora come ora per fare il tutto sto facendo nel seguente modo, come mi e' stato suggerito su 86 altro forum :
    Cifra per cifra potresti fare in questo modo:

    _- Leggo _il primo numero da input (come stringa) e verifico che sia lungo 20 caratteri;
    _- Leggo il secondo numero da input e verifico che sia lungo 20 caratteri o meno;
    _- Usando la funzione "atoi" dentro ad un for converto carattere per carattere la stringa in interi, che metto in un array (lo fo per entrambi i numeri)
    _- Con una funzione costruita ad hoc eseguo la sottrazione tra i due array, facendo attenzione ai riporti e alla lunghezza dei due array;

    Il problema arriva in quest'ultimo punto
    Infatti non capisco perché:

    1) mettiamo che ad esempio si voglia fare 123 meno 4

    sarebbe necessario che il programma legga i due numeri come 123 meno 004 e non come 123 meno 400
    il problema infatti e' far partire ilprogramma a fare la sottrazione dall'ultima cifra e non dalla prima.. te hai consigli per fare ciò?


    viceversa avevamo pensato di fare leggere al programma 123 come
    00000000000000000123
    meno
    00000000000000000003

    ossia aggiungendo all'inizio del numero tanti zeri quanti sono le cifre mancanti per arrivare a 20.
    ma come fare questo?


    una volta che si hanno i due numeri a 20 cifre complete si pensava di fargli fare una sottrazione tra prima cifra da sinistra del primo numero e prima cifra da sinistra del secondo numero. e che quindi controllasse che:
    se la cifra del primo numero e' maggiore o uguale aquella del secondo faccia la semplice sottrazione tra due numeri e la memorizzi
    se invece la cifra del primo numero è minore di quella del secondo consideri la prima cifra con l'aggiunta di 10, quindi faccia la normale sottrazione e scali il risultato dell' operazione delle due cifre precedenti di uno.

    ci sono modi più rapidi?
    grazie mille
    ciao

    Andrea

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da f1gp4
    ... su 86 altro forum :
    Che vuol dire su "86 altro forum" ?

    In ogni caso, va bene la procedura che hai descritto anche se alcuni punti non sono necessari. Direi che una versione corretta potrebbe essere

    1) Leggere il primo valore come stringa
    2) Leggere il secondo valore come stringa

    Il controllo della lunghezza delle due stringhe dipende dal grado di gestione degli errori che vuoi implementare. E poi in una sottrazione il primo operando puo' essere minore del secondo ... il risultato sara' negativo, ma non so se rientra nelle specifiche del tuo problema ...

    3) Usando una funzione appositamente scritta, esegui la sottrazione delle due stringhe (che sono array ...) ...

    Per quest'ultima, devi fare in modo che i dati siano "allineati a destra" (aggiungendo zeri a sinistra fino alle 20 cifre ...), e in un ciclo dall'ultimo carattere al primo, esegui la sottrazione tra due cifre cosi' come hai imparato alle elementari ... ovviamente devi preparare un array come risultato ...

  8. #8
    86 e' un errore di battitura. al posto di 86 ci voleva la parola un
    (scrivo da cellulare e il t9 ha preso 86)

    detto questo volevo chiedervi la "correzione" del programma che ho battuto insieme ad un amico per fare la sottrazione tra due numeri naturali di massimo 20 cifre cad.

    grazie mille
    ciao

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define TERM 100
    
    int main(int argc, char *argv[]) 
    {
     char num[21];
     char num2[21];
    
     printf("Inserisci il primo numero\n");
     scanf("%s",&num);
     printf("Inserisci il secondo numero\n");
     scanf("%s",&num2);
    
     //Inizio a copiare l'array char dentro un array int
     unsigned int num_i[20];
     unsigned int num_i2[20];
    
     int pos;
     char temp[2];
     temp[1]='\0';
     for (pos=0; pos<=20; pos++) 
     { 
      temp[0]=num[pos];
      num_i[pos]=atoi(temp);
      printf("%i\n",num_i[pos]);
     } 
    
     temp[1]='\0';
     for (pos=0; pos<=20; pos++)
     {
      temp[0]=num2[pos];
                    num_i2[pos]=atoi(temp);
                    printf("%i\n",num_i2[pos]);
            }
     
     int numero[20],numero2[20];
     memset(numero,'0',sizeof(numero));
            memcpy(numero+20-strlen(num),num_i,strlen(num));
            memset(numero2,'0',sizeof(numero2));
            memcpy(numero2+20-strlen(num2),num_i2,strlen(num2));
     
     //Inizio la sottrazione
     int cicle,int result[20];
     for (cicle=20;cicle>=0;cicle--)
     {
       if( sizeof(numero2) > sizeof(numero) )
        printf("Errore! Perfavore inserire prima il numero maggiore!\n");
        exit 0;
       if( numero[cicle] > numero2[cicle]) 
        result[cicle] = numero[cicle] - numero2[cicle];
       if( numero[cicle] < numero2[cicle])
       {
        numero[cicle-1]--;
        numero[cicle] += 10;
        result[cicle] = numero[cicle] - numero2[cicle];
       }
       if( numero[cicle] < 0)
        printf("Errore!\n");
     printf("Il risultato della sottrazione è: %i",reult);  
    
     return(0);
    }
    ciao

    Andrea

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il sorgente presenta molti problemi, anche dal punto di vista della logica ... perche' convertire i caratteri in int quando e' possibile operare direttamente con loro ?

    E poi ci sono degli errori come

    scanf("%s",&num);

    in cui &num e' sbagliato perche' il nome dell'array di char e' gia' un puntatore. Quindi

    scanf("%s", num);

    Ti propongo un mio esempio. Tieni conto che in questo esempio l'input non e' controllato.
    In ingresso si presuppone ci siano due stringhe numeriche di massimo 20 cifre e la prima deve essere maggiore o uguale rispetto alla seconda ...

    Se vuoi, puoi aggiungere i controlli relativi, se devi farlo ...

    codice:
    #include <stdio.h>
    #include <string.h>
    
    void RAlign(char *s)
    {
      int ix;
    
      ix = strlen(s);
      strncpy(s+(20-ix), s, ix);
      s[ix]='0';
      strnset(s, '0', 20-ix);
      s[20]=0;
    }
    
    void RemoveRZero(char *s)
    {
      int ix;
    
      for(ix=0; ix<19; ix++)
        if(s[ix]=='0')
          s[ix]=' ';
        else
          break;
    }
    
    int main(int argc, char *argv[]) 
    {
      int ix, cy;
      char numA[21];
      char numB[21];
      char res[21];
    	
      // Input (nessun controllo sull'input e A>=B)
      printf("Inserisci il primo numero\n");
      scanf("%s", numA);
      printf("Inserisci il secondo numero\n");
      scanf("%s", numB);
    
      // Allinea a destra valori
      RAlign(numA);
      RAlign(numB);
    
      // Azzera risultato
      for(ix=0; ix<20; ix++) 
        res[ix]='0'; 
      res[ix]=0;
    
      // Esegue operazione
      cy = 0;
      for(ix=19; ix>=0; ix--)
      {
        res[ix]= numA[ix] - numB[ix] + '0' - cy;
    
        cy = 0;
        if(res[ix] < '0')
        {
          res[ix]=res[ix]+10;
          cy=1;
        }
      }
    
      // Sostituisce zeri iniziali con blank
      // dai valori e dal risultato
      RemoveRZero(numA);
      RemoveRZero(numB);
      RemoveRZero(res);
    
      // Mostra operazione e risultato
      printf("\n\n%s -\n%s =\n--------------------\n%s\n", numA, numB, res);
    
      // Termina
      return(0);
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.