C语言大数相乘问题普通算法->acm.scu.edu.cn:1002

问题描述:

Calculate A × B

Input

The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.

Output

For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.


Input and output are the same with problem 1001.

But A and B may be big integer.

The biggest integer is less than 10^500.

#include<string.h>

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>


#define N 500

void reverse(char *num,char *newnum){	/*reverse()函数用于颠倒字符串,将num字符串以反顺序存放到newnum中,目的是将便于之后从个位进行计算*/
    int length=strlen(num);
     int i,j;
    for(i=0,j=length-1;i<length;i++,j--){
    newnum[i]=num[j];
        
     }    
}

void transform(char* num_char,int *num_int){    /*transform()函数用于将num_char字符串转换成整数字符串,便于进行数字计算*/
    int len=strlen(num_char);
    int i;
    char *newchar;
    newchar=(char*)malloc(sizeof(char)*len);    
    reverse(num_char,newchar);
    
    for(i=0;i<len;i++){
         num_int[i]=newchar[i]-'0';
    }    
    
     }

void multiply(char *num1,char *num2,int *result){  /*multiply()函数将传入的两个大数的字符串形式在内部转换后相乘,将结果返回给整数数组*/
    int i,j,k;
    int len1=strlen(num1);
    int len2=strlen(num2);
    int numint1[len1],numint2[len2];
    transform(num1,numint1);
    transform(num2,numint2);
    int len3=len2+len1;
    for(i=0;i<len3;i++){
        result[i]=0;
    }
    for(i=0;i<len1;i++){
        for(j=0;j<len2;j++){
            result[i+j]+=numint1[i]* numint2[j];
        }
        }
    for(i=0;i<len3;i++){
        result[i+1]+=(result[i]/10);    
        result[i]=(result[i]%10);
        }
    
     }
void display(int *result)/*将整个整数数组显示,其中数组前面的0不显示,这样达到显示正确结果的目地*/
{
    int i=2*N-1;
    while(result[i]==0)
    {
        i--;
    }
    for(i;i>=0;i--)
    {
    printf("%d",result[i]);
    }
    printf("\n");
}



int main(void)
{
  char number1[N],number2[N];
  int result[2*N];
    int i,j;
    
    
    while(scanf("%s%s",number1,number2)==2)
   {

    for(i=0;i<2*N;i++){
        result[i]=0;
    }
    multiply(number1,number2,result);
    display(result);
   }
    return 0;

}    

    
这道题虽然没那么难,但是我花了一个多星期才陆陆续续写出来,对每个函数编写了测试模块(原谅我是真的菜,在参考了别人的代码之后,还是不能正确写出来,后面大多数时间都在调试...,对每个函数编写测试模块的原因是我找不出哪里除了问题,一直说Segementation fault.能写出来是真的开心,后面再参考其他更先进的算法)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值