1.大数加法.
int big_num_add(unsigned long *a, unsigned long *b, unsigned long *c, int len)
{
int u = 0;
int v = 0;
int i = 0;
for(i=len-1; i>=0; i--)
{
if(a[i] > 99999999 || b[i] > 99999999)
{
printf("数字超限\n");
return -1;
}
c[i] = a[i] + b[i];
if(c[i] > 99999999)
{
c[i] -= 100000000;
u = 1;
}
else
{
u = 0;
}
if(c[i] + v > 99999999)
{
c[i] += v;
c[i] -= 100000000;
u = 1;
}
else
{
c[i] += v;
}
v = u;
}
return v;
}
2.亿位乘法.
int big_num_mul_long(unsigned long a, unsigned long b, unsigned long *c)
{
unsigned long d[2];
unsigned long e[2];
unsigned long f[2];
unsigned long g[2];
unsigned long h[2];
unsigned short q[10];
memset(d, 0x00, sizeof(d));
memset(e, 0x00, sizeof(e));
memset(f, 0x00, sizeof(f));
memset(g, 0x00, sizeof(g));
q[3] = b % 10000;
q[2] = b / 10000;
q[1] = a % 10000;
q[0] = a / 10000;
d[0] = q[0] * q[2];
e[1] = q[1] * q[3];
f[0] = q[0] * q[3];
q[4] = f[0] / 10000;
q[5] = f[0] % 10000;
f[0] = q[4];
f[1] = q[5] * 10000;
g[0] = q[1] * q[2];
q[4] = g[0] / 10000;
q[5] = g[0] % 10000;
g[0] = q[4];
g[1] = q[5] * 10000;
big_num_add(d, e, h, 2);
big_num_add(h, f, d, 2);
big_num_add(d, g, c, 2);
return 0;
}
3.大数乘法
int big_num_mul(unsigned long *a, unsigned long *b, unsigned long *c, int len)
{
unsigned long d[2*len];
unsigned long e[2*len];
unsigned long f[2*len];
unsigned long g[2*len];
unsigned long h[2*len];
int u = len;
int v = len * 2;
int w = len / 2;
memset(c, 0x00, 2*len);
//(ax+c)(bx+d) = abx^2+(ad+bc)x+cd;
if(u != 1)
{
big_num_mul(a, b, d, w);
printf("1: ");
print_num(d, v);
big_num_mul(a+w, b+w, e+2*w, w);
printf("2: ");
print_num(e, v);
big_num_mul(a, b+w, f+w, w);
printf("3: ");
print_num(f, v);
big_num_mul(a+w, b, g+w, w);
printf("4: ");
print_num(g, v);
big_num_add(d, e, h, v);
printf("5: ");
print_num(h, v);
big_num_add(h, f, d, v);
printf("6: ");
print_num(d, v);
big_num_add(d, g, c, v);
printf("7: ");
print_num(c, v);
}
else
{
big_num_mul_long(*a, *b, c);
printf("0: ");
print_num(c, 2);
}
return 0;
}
4.头文件.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
5.输出函数.
int print_num(unsigned long *a, int len)
{
int i = 0;
printf("num=[");
for(i=0; i<len; i++)
{
printf("%08d", a[i]);
}
printf("]\n");
return 0;
}
6.主函数.
int main()
{
unsigned long a[10] = {12345678, 56781234, 0,0,0,0,0,0,0,0};
unsigned long b[10] = {87654321, 43218765, 0,0,0,0,0,0,0,0};
unsigned long c[10] = {0};
int i = 0;
big_num_mul(a, b, c, 2);
return 0;
}