Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

[C]dodawanie dowolnie dużych liczb w C

#1
[C]dodawanie dowolnie dużych liczb w C
Dostałem zadanie napisania programu ,który dodaje dodwolnie duże dwie dodatnie liczby rzeczywiste. Nie wiem jak się za to zabrać. Jesteśmy na poziomie dynamicznych tablic w C. Jeśli to możliwe to proszę o gotowy kod lub stronę gdzie się znajduje. Proszę o pomoc.
 System operacyjny: windows_vista Przeglądarka: ie
#2
RE: [C]dodawanie dowolnie dużych liczb w C
Zrób to jako dwie tablice znaków. Normalne dodawanie, jak pod kreskąOczko
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#3
Ściana  RE: [C]dodawanie dowolnie dużych liczb w C
Jestem generalnie kiepski z programowania. Nie wiem jak to zapisać w kodzie.
 System operacyjny: windows_vista Przeglądarka: ie
#4
RE: [C]dodawanie dowolnie dużych liczb w C
Przedstaw co masz, z czym masz problem, a wtedy Ci ktoś podpowie.
Chyba największym problemem może być wczytanie danych wejściowych. Aczkolwiek konsola windows ma ograniczenie do 2k lub 4k znaków - to chyba najprostsze rozwiązanie.
Dane zapisujesz nie w zmiennych liczbowych, tylko jako tablice char-ów. Mając 2 tablice z dwiema wartościami, zacząłbym od znalezienia przecinka w każdej z nich - licząc w słupku zawsze się podpisuje część całkowitą jednej liczby pod drugą, podobnie część ułamkową.
Teraz potrzebujesz sobie stworzyć tablicę na wynik - musi ona uwzględniać długości obu liczb (długość będzie sumą długości dłuższej części dziesiętnej, dłuższej ułamkowej, przecinka oraz 1 znak z przodu dodatkowo na ewentualne przeniesienie). Mam na myśli to, że jeśli mamy liczbę
Kod:
1234,56
  12,3464572
To potrzebna nam długość będzie równa 4(część całkowita liczby peirwszej)+7(część ułamkowa liczby drugiej)+1(przecinek)+1(przeniesienie) = 13.
Teraz musisz zrobić dodawanie, czyli przepisać fragment części ułamkowej, która "wystaje" poza część ułamkową liczby 1, czyli 64574.
Teraz wykonujesz sumowania każdej pary cyfr, czyli od końca 6 i 4, 5 i 3, przepisujesz przecinek, 4 i 2, 3 i 1. Tu kończy Ci się liczba druga. Pamiętać musisz o przeniesieniach, czyli dla sumowania 6 i 4 masz wynik 10. Do tablicy wynikowej wpisujesz 0, a 1 to przeniesienie do kolejnego dodawania, czyli 5 i 3 (do wynikowej zapiszesz 5 + 3 + 1), przepełnienie = 0. Jak dojdziesz do początku krótszej liczby przepisujesz pozostałą część dłuższej liczby (pamiętając ciągle o przeniesieniu).
Poza tym pamiętaj, że operujesz na znakach, więc de facto cyfra 5 nie ma wartości 5, a 53 (kod ascii znaku '5'). Żeby uzyskać cyfry musisz odejmować 48, a przy zapisie do tablicy wynikowej dodawać 48.
 System operacyjny: windows_xp_2003 Przeglądarka: opera
#5
RE: [C]dodawanie dowolnie dużych liczb w C
A jak napisać początek takiego programu? Nie pisałem nigdy programu ,który by zamieniał liczby na znaki. Nawiasem mówiąc mam bardzo mało czasu na ten program. (do środy)
 System operacyjny: windows_vista Przeglądarka: ie
#6
RE: [C]dodawanie dowolnie dużych liczb w C
Kod:
...
char tab[]={"0123456789"};
for(int i=0;i<strlen(tab);i++)    //nie pamiętam, czy znak null jest liczony
    printf("%d\n",int(tab[i])-48);
...
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#7
RE: [C]dodawanie dowolnie dużych liczb w C
Mógłbyś wyjaśnic co napisałeś?
 System operacyjny: windows_vista Przeglądarka: ie
#8
RE: [C]dodawanie dowolnie dużych liczb w C
Zamieniasz znak na liczbę typu int, więc dalej nie powinieneś mieć problemu (kiedyś napisałem program sumujący dwie długie liczby naturalne).
Kod:
#include<iostream.h>
#include<string.h>
#include<time.h>
#include<stdio.h>
#include<conio.h>
const long maks_r=10000;
void odwrot(int lewy,int prawy, char *t)
{
    if(lewy>prawy)
        return;
    else
    {
        char pom=t[lewy];
        t[lewy]=t[prawy];
        t[prawy]=pom;
        odwrot(lewy+1,prawy-1,t);
    }
}
void wypelnij(int lewy,int prawy,char znak,char *t)
{
    if(lewy>prawy)
        return;
    else
    {
        t[lewy]=znak;
        wypelnij(lewy+1,prawy,znak,t);
    }
}
void sumator(char *t1,char *t2,int key)
{
    char wynik[maks_r+1];
        long A,i,k=0;
        short a,b,suma,pamiec,flag=0;
    odwrot(0,strlen(t1)-1,t1),odwrot(0,strlen(t2)-1,t2);
    if(strlen(t1)>strlen(t2))
    {
        A=strlen(t1),wypelnij(strlen(t2),A-1,'0',t2);
    }
    else
    {
        A=strlen(t2),wypelnij(strlen(t1),A-1,'0',t1);
    }
        wynik[k++]=char(1);
        for(i=0;i<A;i++)
        {
                a=int(t1[i])-48,b=int(t2[i])-48;
                if(flag==1)
                {
                        flag=0;
                        suma=a+b+pamiec;
                }
                else
                        suma=a+b;
                if(suma>9)
                {
                        pamiec=1;
                        flag=1;
                        suma%=10;
                        wynik[k++]=char(suma+48);
                }
                else
                        wynik[k++]=char(suma+48);
        }
        if(flag==1)
                wynik[k++]='1';
        odwrot(0,k-1,wynik);
        if(key=='n'||key=='N')
                for(i=0;wynik[i]!=char(1);i++)
                        cout<<wynik[i];
        else
        {
                odwrot(0,strlen(t1)-1,t1),odwrot(0,strlen(t2)-1,t2);
                FILE *plik;
                plik=fopen("c:\\wynik.txt","a");
                fputs("\n",plik),fputs(t1,plik),fputs("\n",plik),fputs(t2,plik),fputs("\n",plik);
                for(long i=0;i<strlen(wynik);i++)
                        fputs("_",plik);
                fputs("\n",plik),fputs(wynik,plik),fputs("\n",plik);
        }
}
void main()
{
        char t1[maks_r]="0",t2[maks_r]="0";
        int key;
        long i=0;
        do
        {
                i=0;
            clrscr();
                cout<<"Program sumujacy duze liczby naturalne\n\n";
                cout<<"Podaj pierwsza liczbe lub wcisnij Enter\n";
                do
                {
                        key=getch();
                        if(key==8)
                        {
                                cout<<"\b \b";
                                if(i==0)
                                        t1[0]='\0';
                                else
                                        t1[i--]='\0';
                        }
                        else if(key<'0'||key>'9')
                                ;
                        else
                        {
                                cout<<char(key);
                                t1[i++]=key;
                        }
          }while(key!=13);
          t1[i]='\0';
          i=0;
          cout<<"\n\nPodaj druga liczbe lub wcisnij Enter\n";
          do
          {
                        key=getch();
                        if(key==8)
                        {
                                cout<<"\b \b";
                                if(i==0)
                                        t2[0]='\0';
                                else
                                        t2[i--]='\0';
                        }
                        else if(key<'0'||key>'9')
                                ;
                        else
                        {
                                cout<<char(key);
                                t2[i++]=key;
                        }
                }while(key!=13);
                t2[i]='\0';
                cout<<"\n\nZapisac wynik w postaci pliku txt (T/N)? ";
                do
                {
                        key=getch();
                        if(key!='t'&&key!='T'&&key!='n'&&key!='N')
                                ;
                }while(key!='t'&&key!='T'&&key!='n'&&key!='N');
                if(key=='n'||key=='N')
                {
                        cout<<"\n\nSuma obu liczb wynosi\n";
                    sumator(t1,t2,key);
                }
                else
                {
                        sumator(t1,t2,key);
                        cout<<"\n\nWynik zapisano w C:\\wynik.txt";
                }
                cout<<"\n\nAby zakonczyc program, kliknij Esc\nW przeciwnym razie kliknij dowolny klawisz.";
                key=getch();
                if(key!=27)
                {
                        for(long i=0;i<maks_r;i++)
                        {
                                t1[i]='\0';
                                t2[i]='\0';
                        }
                }
        }while(key!=27);
}
Może Ci się przyda. Powodzenia.
Ponieważ napisałem ten program dawno temu, nie pamiętam, po co są te wszystkie funkcje, więc nie pytaj mnie ☺.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#9
RE: [C]dodawanie dowolnie dużych liczb w C
Jest chyba napisany w C++. Ale myślę ,że go chyba odszyfruję...
 System operacyjny: windows_vista Przeglądarka: ie
#10
RE: [C]dodawanie dowolnie dużych liczb w C
Aaaaa odcyfrowywanie tego to prawdziwa masakra! Nie ma nikt gotowca tyle ,że w ,,C" a nie w ,,C++"????
 System operacyjny: windows_vista Przeglądarka: ie
Programy: Polecane / Nowe / Inne



Użytkownicy forum szukali:
dodawanie bardzo dużych liczb cc sumowanie liczbc++ bardzo duże liczbyc++ dodawanie dużych liczbdodawania duzych liczbdodawanie bardzo dużych liczb c++Dodawanie duzych liczb z przecinkiem c++dodawanie dużych liczb c++

Podobne wątki ([C]dodawanie dowolnie dużych liczb w C)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
Question Wyznaczanie maksimum spośród 5 liczb - schemat blokowy mistrz18 5 12001 05.10.2017, 19:49
Ostatni post: broda99
  Java- wypisanie liczb, które nie są podane w tablicy , wypisanie liczb z tablicy all? ccomp 10 20290 16.07.2017, 20:10
Ostatni post: ccomp
  [C# WPF] Dodawanie elementów z listy do DataGrid Kamil 1 2 11233 25.05.2017, 20:03
Ostatni post: Kamil 1

Skocz do: