poj2389--大数乘法C和Java实现

poj2389--大数乘法C和Java实现
大整数的乘法。假设求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);
    }


}

啊。。。

你可能感兴趣的:(poj2389--大数乘法C和Java实现)