天意相乘

明天在做大数相乘。不会做,以为很费劲。去百度上搜,结果搜到一个让自身一语中的的二个代码。分享一下,记录一下。

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
 
#define N 100  
 
/*
 *就要数组中保存的字符串转成数字存到int数组中
*/ 
void getdigits(int *a,char *s) 

     int i; 
     char digit; 
     int len = strlen(s); 
 
     //对数组伊始化  
     for(i = 0; i < N; ++i) 
           *(a + i) = 0; 
     for(i = 0; i < len; ++i)
  { 
           digit = *(s + i); 
           *(a + len – 1 – iState of Qatar = digit –
‘0’;//字符串s=”12345″,由此首先个字符应该留存int数组的末尾二个职位  
     } 

 
/*
 *将数组a与数组b逐位相乘现在存入数组c
 */ 
void multiply(int *a,int *b,int *c) 

     int i,j; 
 
     //数组初步化  
     for(i = 0; i < 2 * N; ++i) 
           *(c + i) = 0; 
     /*
      *数组a中的每位逐位与数组b相乘,并把结果存入数组c
      *比如,12345*12345,a中的5与12345逐位相乘
      *对此数组c:*(c+i+j卡塔尔(قطر‎在i=0,j=0,1,2,3,4时存的是5与诸位相乘的结果
     
*而在i=1,j=0,1,2,3,4时不光会存4与各位相乘的结果,还可能会累计上上次相乘的结果.那点是须求小心的!!!
     */ 
     for(i = 0; i < N; ++i) 
           for(j = 0; j < N; ++j) 
                 *(c + i + j) += *(a + i) * *(b + j); 
     /*
      *此间是移动、进位
     */ 
     for(i = 0; i < 2 * N – 1; ++i) 
     { 
           *(c + i + 1) += *(c +
iState of Qatar/10;//将10位上的数向前行位,并加上原本这几个位上的数  
           *(c + i) = *(c + i卡塔尔(قطر‎%10;//将盈余的数存原来之处上  
     } 

 
int main() 

    int a[N],b[N],c[2*N]; 
    char s1[N],s2[N]; 
    int j = 2*N-1; 
    int i; 
     
  
    scanf(“%s”,s1); 
    scanf(“%s”,s2); 
     
    getdigits(a,s1); 
    getdigits(b,s2); 
     
    multiply(a,b,c); 
     
    while(c[j] == 0) 
               j–; 
    for(i = j;i >= 0; –i) 
           printf(“%d”,c[i]); 
    printf(“n”); 
    return 0;