Chodzi dokładnie o zapis mnożenia dowolnie wielkiej liczby całkowitej, przez dowolnie wielką całkowitą, (przechowywane w tablicach).
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tamunsigned char a[N], b[N], c[N+N];
int p1, p2;
for(p1 = 0; p1<N+N; p1++)
c[p1] = 0;
for(p1 = 0; p1<N; p1++) {
for(p2 = 0; p2<N; p2++) {
c[p1+p2] += (a[p1] * b[p2]) & 0xff;
c[p1+p2+1] += (a[p1] * b[p2]) >> 8;
}
}shg napisał:No to przypomnij sobie z podstawówki mnożenie sposobem pisemnym :]
a na tablicach (liczby w formacie binarnym, najmniej znaczacy bajt ma indeks 0):
unsigned char a[N], b[N], c[N+N]; int p1, p2; for(p1 = 0; p1<N+N; p1++) c[p1] = 0; for(p1 = 0; p1<N; p1++) { for(p2 = 0; p2<N; p2++) { c[p1+p2] += (a[p1] * b[p2]) & 0xff; c[p1+p2+1] += (a[p1] * b[p2]) >> 8; } }
unsigned char a[N], b[N], c[N+N];
unsigned int p1, p2, p3, resm, resa;
for(p1 = 0; p1<N+N; p1++)
c[p1] = 0;
for(p1 = 0; p1<N; p1++) {
for(p2 = 0; p2<N; p2++) {
resm = a[p1] * b[p2];
resa = c[p1+p2] + (resm & 0xff);
c[p1+p2] = resa & 0xff;
resa >>= 8; /* przeniesienie z dodawania */
resa = c[p1+p2+1] + (resm >> 8) + (resa >> 8); /* MSB iloczynu + przeniesienie z poprzedniego dodawania */
c[p1+p2+1] = resa & 0xff;
resa >>= 8; /* i kolejne przeniesienie */
/* powtarzamy dopóki nie będzie co przenosić */
for(p3 = p1+p2+2; resa > 0; p3++) {
resa = c[p3] + resa; /* dodać przeniesienie */
c[p3] = resa & 0xff;
resa >>= 8; /* i nastepne przeniesienie */
}
}
}