Dodawanie dwóch dużych liczb ze znakiem.

0

Witam. Jestem na ostatniej prostej mojego projektu lecz potrzebuję pomocy. Muszę jedynie doprowadzić program do wpisania liczb, dodania i wyświetlenia wyniku. Ktoś mógłby naprowadzić mnie jak to zrobić?

Dla podanego zadania opracować projekt programu uwzględniający podział problemu na podproblemy oraz struktury danych. Projekt przedstawić do oceny. Zakodować program zgodnie z projektem. Uruchomić program i przeprowa­dzić jego testowanie. Ocenie podlega zarówno program jak i sposób i zakres testowania.
Wolno używać jedynie statycznych typów danych (tablice, struktury itd.).

Zrealizować sumowanie pary co najwyżej 80-cyfrowych liczb całkowitych ze znakiem (nie mogą być one reprezen­towane wewnętrznie nawet jako żaden typ liczbowy).


Projekt:

/*  1. Wczytanie liczb
  2. Dodawanie liczb
  - określenie znaku liczby
  - dodawnie liczby tego samego znaku
  - dodawnie modułów liczb
  - określenie znaku wyniku

  - dodawnie liczb różnych znaków
  - dodawanie modułów liczb
  - porównanie modułów liczb
  - określenie znaku wyniku

 {
    bool dodatnia;
    int cyfr [80];
    int liczba_cyfr;
 }
 */

Program:

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

struct Liczba
{
    bool dodatnia; //bool
    int cyfry[80]; // pod indeksem 0 jest najbardziej znaczaca cyfra
    int liczba_cyfr;
};

 int main()
 {


bool wczytajLiczbe( struct Liczba *liczba)
{
    char s[100];

    gets( s );

    int index_s = 0;
    int index_cyfry = 0;

    // pomin biale znaki
    while( index_s < strlen(s) && s[index_s] == ' ')
    {
        index_s ++;
    }

    // zaakcepuj znak liczby
    liczba->dodatnia = true;
    if( s[index_s] == '-')
    {
        liczba->dodatnia = false;
        index_s ++;
    }
    else
        if( s[index_s] == '+')
        {
            index_s ++;
        }

    // pomoin zera nieznaczace
    while( index_s < strlen(s) && s[index_s] == '0')
    {
        index_s ++;
    }


    // wczytuj cyfry

     while( index_s < strlen(s) && isdigit( s[index_s]  ))
     {
         liczba->cyfry[index_cyfry] = s[ index_s ] - '0';
         index_s ++;
         index_cyfry++;
     }
        
        liczba -> liczba_cyfr = ????
        
        
        
        
  int main()
{
    struct Liczba l1, l2, wynik;

    wczytajLiczbe( & l1 );
    wczytajLiczbe( & l2 );

    dodalLiczby(& l1, &l2, & wynik);

    wyswietlLiczbe( & wynik);
}      


bool dodajModulyLiczb( struct Liczba * l1, struct Liczba * l2, struct Liczba * wynik)
{
    int przeniesienie = 0;
    int i = 0;
    while( i < l1->liczba_cyfr && i < l2->liczba_cyfr)
    {
        wynik->cyfry[i] = l1->cyfry[i] + l2->cyfry[i] + przeniesienie;
        if( wynik->cyfry[i] > 9)
        {
            przeniesienie = 1;
            wynik->cyfry[i] -= 10;
        }
        else
            przeniesienie = 0;
        ++i;
    }
    struct Liczba * l;
    if( l1->liczba_cyfr > i)
        l = l1;
    else
        l = l2;

    while( i < l->liczba_cyfr)
    {
        wynik->cyfry[i] = l->cyfry[i] + przeniesienie;
        if( wynik->cyfry[i] > 9)
        {
            przeniesienie = 1;
            wynik->cyfry[i] -= 10;
        }
        else
            przeniesienie = 0;
        ++i;
    }

}

 return 0;
 }


0

sposob lopatologiczny

idziesz od tylu obu liczb ktore maja byc dodane powiedzmy ze to bedzie

123456789
9876

wiec skoro idziemy od tylu, to znajdujemy najpierw "tyl" dla jednego i drugiego w tym przypadku pierwszy przebieg petli bedzie 6 + 9. Wpisujemy najmniej znaczaca liczbe (czyli 5) oraz zapisujemy ile mamy dodac w nastenpnym porownaniu. Bedzie to 1 wiec nastepne dodawanie bedzie wygladac 6 + 8 + 1. Powtarzamy cala operacje az skonczymy obie liczby (petle).

Jezeli jedna sie skonczy to mozemy ja pominac i po prostu "dodawac" to co jest w dluzszym napisie na zasadzie 1 + 0 + 0 . Pierwsze zero jest z "drugiej" tablicy a trzecie zero jest z "przejscia" liczby jezeli jest powyzej 10

jest jeden wyjatek. Jezeli przy ostatnim (czyli o indeksie zero) wynik bedzie wiekszy od 10 to trzeba wszystko poprzesuwac o 1 w prawa strone

Masz najglupsze rozwiazanie, teraz jak zaimplementujesz to zapewne wpadniesz na lepszy pomysl

0

A jak to przełożyć na kod?

1 użytkowników online, w tym zalogowanych: 0, gości: 1