大整数的乘法。假设求a*b,做法是将b的每一位与a相乘后再求和,注意b的不同位权值是不一样的。
以下是本题代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 100
void Out(char *s)
{
for(int i = 0; i < 10; i++)
printf("%d", s[i]);
putchar(10);
}
void Add(char *num1, char *num2)
{
int i, j;
for(i = 0; i < LEN; i++)
num1[i] += num2[i];
int t = 0;
int t2;
for(i = 0; i < LEN; i++)
{
t2 = num1[i] + t;
t = t2 / 10;
num1[i] = t2 % 10;
}
}
void Multi(char *num1, int n, int w)
{//num1与n相乘,n的权重为10^(w-1)
int i, j;
char c;
int len = LEN;
while(num1[--len] == 0 && len > 0);
for(i = len; i >= 0; i--)//move
num1[w - 1 + i] = num1[i];
for(i = 0; i < w - 1; i++)
num1[i] = 0;
for(i = 0; i < LEN; i++)//multiply
num1[i] *= n;
int t = 0;
int t2;
for(i = 0; i < LEN; i++)//carry bit
{
t2 = num1[i] + t;
t = t2 / 10;
num1[i] = t2 % 10;
}
}
void Reverse(char *s)
{
int len = strlen(s);
for(int i = 0; i < len / 2; i++)
{
char c = s[i];
s[i] = s[len - 1 - i];
s[len - 1 - i] = c;
}
}
void ToNum(char *s)
{
int len = strlen(s);
for(int i = 0; i < len; i++)
s[i] -= '0';
}
void Copy(char *t, char *f)
{
for(int i = 0; i < LEN; i++)
t[i] = f[i];
}
char A[LEN];//最终结果
char B[LEN];//乘数
char C[LEN];//乘数
char D[LEN];
/*
*获取C[]的每一位与B[]相乘,结果存在D[]中,
*并不断将D[]加到A[]上,最后A[]中存的就是结果
*/
int main()
{
int i, j;
gets(B);
gets(C);
int lenc = strlen(C);
Reverse(B);
Reverse(C);
ToNum(B);
ToNum(C);
int w = 1;
for(i = 0; i < lenc; i++)
{
Copy(D, B);
Multi(D, C[i], i + 1);
Add(A, D);
}
i = LEN;
while(A[--i] == 0 && i > 0);
for(; i >= 0; i--)
printf("%d", A[i]);
putchar(10);
//system("pause");
}
下面是java版本的代码,突然感觉用C写大数纯粹是自虐
import java.math.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine();
String s2 = sc.nextLine();
BigInteger b1 = new BigInteger(s1);
BigInteger b2 = new BigInteger(s2);
BigInteger b3 = b2.multiply(b1);
System.out.println(b3);
}
}
啊。。。
posted on 2012-08-12 11:16
小鼠标 阅读(461)
评论(0) 编辑 收藏 引用 所属分类:
大数