Wątek zablokowany 2011-05-26 13:35 przez madmike.

Iloczyn stringów

0

Witam. Próbuję zrobić własną funkcję w C++ (w builderze) do której wprowadza się dwa stringi (zakładamy, ze to znaki od 0 do 9) i funkcja zwraca jeden string będący iloczynem tych dwóch. Czyli stringi liczba1 = "1234" i string liczba2 = "2" funkcja zwróci string wynik = "2468". Głównie potrzebuję tej funkcji do szyfrowania, gdzie mnożę liczby kilkudziesięcio cyfrowe (zawsze dwie).

Swoją funkcje oparłem na "mnożeniu pisemnym". Najpierw wprowadzone stringi pętlą przepisuje na tablice int, gdzie [0] to liczba jednosci [1] liczba dziesiątek [2] liczba setki itp.. Potem operacje mnożenia, t to jest zmienna tymczasowa dla napisu liczby do następnej w pisemnym mnożeniu.

Oto funkcja :

string mnozenie(string liczba1, string liczba2);
string mnozenie(string liczba1, string liczba2)
{
char wynik[1000];
int a[1000], b[1000], wynik1[1000]={NULL};
for(int i=liczba1.length()-1, j=0;i>=0;i--, j++)a[j]=(int)liczba1[i]-48;
for(int i=liczba2.length()-1, j=0;i>=0;i--, j++)b[j]=(int)liczba2[i]-48;

for(int i=0, j=0, t=0;i<100;i++)
        {
        wynik1[j]=((a[i]*b[j])%10)+t;
        t=((a[i]*b[j])/10);
        if(i==liczba1.length())
                {
                j++;
                i=0;
                }
        if(j==1000)break;
                       }
for(int i=0;i<1000;i++)
        {
        if(wynik1[i]>10)
                {
                wynik1[i+1]=wynik1[i]/10;
                wynik1[i]=wynik1[i]%10;
                }
        wynik[i]=wynik1[i];
        }

return wynik;
}

Godzinami się jej przyglądam i nie wiem co w niej jest źle. Proszę o pomoc!

0

string mnozenie(string liczba1, string liczba2);

dlaczego napisałeś nagłówek 2 razy??? To pierwsze wygląda coś jak ala prototyp ?funkcji?
Ale tak w ogóle... Jak ty chcesz pomnożyć stringi??? Mogę się mylić... ale mi sie wydaje, że co najwyżej możesz je dodać... A poza tym nie rozumiem po co CI taka funkcja... A poza tym jeżeli dodajesz stringi to :
1+1=11 !!! a 1234+2 = 12342 !!!

0

error C2676: binary '*' : 'std::string' does not define this operator or a conversion to a type acceptable to the predefined operator

taki błąd wyskakuje gdy mnoży się stringi...

0

Sid_, skończ już... Jakbyś przeczytał post damiaaana to byś wiedział, że on chce zrobić mnożenie bignumów trzymanych jako stringi...

0
#include <iostream>
#include <string>
using namespace std;


string mnozenie(string liczba1, string liczba2)
{
char wynik[1000010];
short int a[1000], b[1000], wynik1[1000010];
for(int i=0;i<1000010;++i) wynik1[i]=0;
for(int i=0;i<liczba1.size();++i) a[liczba1.size()-1-i]=liczba1[i]-'0';
for(int i=0;i<liczba2.size();++i) b[liczba2.size()-1-i]=liczba2[i]-'0';

for(int i=0;i<liczba1.size();++i)
	for(int j=0;j<liczba2.size();++j)
		wynik1[i+j]+=a[i]*b[j];

int c=0;
for(int i=0;((i<(liczba1.size()+liczba2.size()-1)) || (c!=0));++i)
{
wynik1[i]+=c;
c=wynik1[i]/10;
wynik1[i]%=10;
}
int size;
for(int i=1000009;i>0;--i)
	if(wynik1[i]!=0)
	{
		size=i;
		break;	
	}
for(int i=size;i>=0;--i)
wynik[size-i]=char(wynik1[i]+'0');
wynik[size+1]='\0';
return wynik;
}
int main()
{
string a,b;
cin>>a>>b;
cout << mnozenie(a,b) << endl;


return 0;
}

Oto poprawiony kod.
Po pierwsze w złej kolejności przepisywałeś wartości z tablicy wynik1 do wynik.
Zmieniłem całkowicie mnożenie.
Zamiast jednej pętli zrobiłem dwie i wydaje mi się, że jest to dużo łatwiejsze.
Więcej o własnej arytmetyce jest na stronie:
http://main.edu.pl/user.phtml?op=show&page=algorytmika&c=50000

0

Przy tym kodzie wywala mi błąd comparing signed and unsiged values w pierwszej linijce funkcji

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