mateczek |
» 2016-12-28 19:58:55 Ogólnie ja to dodałem w twoim kodzie to co brakowało do poprawnego działania. Ale nie brał bym się w ten sposób do takiego zadania!!! Ja bym to zadanie zrobił w sposób jak poniżej. I zamiast sytemu dziesiętnego zastosował bym system. (10 kwadrylion-owy) :P i 32cyry upakował w tablicy 2 wartości long long :) jak poniżej. przykład łopatologiczny bez zabezpieczeń przieniesień tylko szkicujący metodę #include <iostream> #include<cmath> using namespace std; int main() { long long big1[ 2 ]; long long big2[ 2 ]; string liczba = { "111111111111111122222222222222222" }; string liczba2 = { "222222222222222111111111111111111" }; string temp = liczba.substr( 0, 16 ); big1[ 0 ] = stoll( temp ); temp = liczba.substr( 16, string::npos ); big1[ 1 ] = stoll( temp ); temp = liczba2.substr( 0, 16 ); big2[ 0 ] = stoll( temp ); temp = liczba2.substr( 16 ); big2[ 1 ] = stoll( temp ); long long wynikl = big1[ 1 ] + big2[ 1 ]; long long wynikH = big1[ 0 ] + big2[ 0 ]; cout << wynikH << wynikl; }
i takim oto sposobem zadanie się trywializuje (brak pętli, operujesz na dwóch wartościach, a i pożyczyć jedynkę można w sposób wręcz banalny) |
|
Beli Temat założony przez niniejszego użytkownika |
» 2016-12-29 20:46:09 Chciałem jeszcze zadać takie bardziej teoretyczne pytanie. Jako że umiem z tego C naprawdę niewiele wolę trzymać się jednak pętli i pojęć raczej podstawowych, no i zadziałało to jakoś dla dodawania i odejmowania, nawet rozumiem jak to działa, co już jest małym cudem. W mnożeniu jednak jest już sporo trudniej, te pętle zagnieżdżone będą w sobie kilkukrotnie, ale na innym forum wyczytałem, że ktoś polecił poradzić sobie z mnożeniem wykorzytsując Dodawanie, tj. 5*5=5+5+5+5+5. No i to już brzmi jak dla mnie dużo prościej, ale czy wywołanie kilkadziesiąt kwadryliardów razy funkcji Dodawanie nie okaże się dla komputera niewykonalne? Nie zależy mi na jakimś super-efektywnym algorytmie, ma to po prostu działać i nie wywołać eksplozji, ale mogę na to liczyć kombinując w tę stronę? |
|
mokrowski |
» 2016-12-29 21:23:28 1. Dla mnożenia powinieneś alokować miejsce na wynik który jest sumą długości liczb (u Ciebie tablic). 2. Przeczytaj sobie to i powinieneś być w stanie zrealizować mnożenie: http://mmsyslo.pl/content/download/292/1164/version/1/file/Piramidy_szyszki_04.pdf
PS. A tu masz całą książkę autora (nie czytałem ale wygląda lekko i strawnie choć pewnie nie jest to kompendium :-) ) |
|
Beli Temat założony przez niniejszego użytkownika |
» 2017-01-12 08:04:27 To mam jeszcze jedną prośbę, bo dzieje się coś czego nie jestem w stanie wyłapać. Mam gotowy kalkulator dla dodawania i odejmowania i testowo wyniki pokazywał dobre, ale z jakiegoś powodu wariuje gdy stała SIZE jest większa niż 30. Czemu tak jest - nie mam pojęcia: #include <stdio.h> #include <stdlib.h>
int Dodawanie( char X[], char Y[], char Z[], int SIZE ) { int i, suma; int p = 0; Z[ SIZE + 1 ] = '\0'; for( i = SIZE - 1; i >= 0; i-- ) { suma = X[ i ] - '0' + Y[ i ] - '0' + p; Z[ i + 1 ] = suma % 10 + '0'; p = suma / 10; } Z[ 0 ] = p + '0'; return p; } int Odejmowanie( char X[], char Y[], char Z[], int SIZE ) { int i, roznica; int p = 0; Z[ SIZE + 1 ] = '\0'; for( i = SIZE - 1; i >= 0; i-- ) { roznica = X[ i ] - '0' - Y[ i ] + '0' + p; if( roznica >= 0 ) { Z[ i + 1 ] = roznica % 10 + '0'; p = roznica / 10; } else { Z[ i + 1 ] = roznica % 10 + 10 + '0'; p = roznica / 10 - 1; } } Z[ 0 ] = p + '0'; return p; }
int main() { int symbol, symbol2; int operacja; const int SIZE = 32; printf( "KALKULATOR DODAWANIA I ODEJMOWANIA\n" "----------------------------------------------------------------------------\n" "Podaj symbol przed liczba, ktorej modul jest wiekszy (wybierz 1 jesli + lub 2 jesli -): \n" ); scanf( "%d", & symbol ); printf( "Podaj modul tej liczby: \n" ); char A[ SIZE ]; scanf( "%s", A ); printf( "Podaj symbol przed druga liczba (wybierz 1 jesli + lub 2 jesli -): \n" ); scanf( "%d", & symbol2 ); printf( "Podaj modul drugiej liczby: \n" ); char B[ SIZE ]; scanf( "%s", B ); char C[ SIZE + 1 ]; printf( "Wybierz operacje: \n1. Dodawanie. \n2. Odejmowanie. \nInny: Opusc program\n" ); scanf( "%d", & operacja ); switch( operacja ) { case 1: { if( symbol == 1 && symbol2 == 1 ) { Dodawanie( A, B, C, SIZE ); printf( "Dodawanie: %s \n", C ); } else if( symbol == 1 && symbol2 == 2 ) { Odejmowanie( A, B, C, SIZE ); printf( "Dodawanie: %s \n", C ); } else if( symbol == 2 && symbol2 == 1 ) { Odejmowanie( A, B, C, SIZE ); printf( "Dodawanie: -%s \n", C ); } else { Dodawanie( A, B, C, SIZE ); printf( "Dodawanie: -%s \n", C ); } break; } case 2: { if( symbol == 1 && symbol2 == 1 ) { Odejmowanie( A, B, C, SIZE ); printf( "Odejmowanie: %s \n", C ); } else if( symbol == 1 && symbol2 == 2 ) { Dodawanie( A, B, C, SIZE ); printf( "Odejmowanie: %s \n", C ); } else if( symbol == 2 && symbol2 == 1 ) { Dodawanie( A, B, C, SIZE ); printf( "Odejmowanie: -%s \n", C ); } else { Odejmowanie( A, B, C, SIZE ); printf( "Odejmowanie: -%s \n", C ); } break; } default: exit( 0 ); } return 0; }
Będę wdzięczny za wskazanie gdzie mogę to poprawić, by działało jak należy. |
|
1 « 2 » |