51Nod-1027-大数乘法

来源:互联网 发布:php用什么软件开发 编辑:程序博客网 时间:2024/05/29 18:05

给出2个大整数A,B,计算A*B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 1000,A,B >= 0)
Output
输出A * B
Input示例
123456
234567
Output示例
28958703552

水题,不多解释了,就是字符串的处理!

代码C:

#include <stdio.h>#include <string.h>#define _MAX 1001void Carrying(int tag,int i,int j,int *p);int main(int argc, const char * argv[]){    int product[2 * _MAX],i=0,j=0,numOneLen,numTwoLen,tag;    char numOne[_MAX],numTwo[_MAX];    memset(product, 0, sizeof(int) * 2 * _MAX);                    //初始化product数据为0    scanf("%s %s",numOne,numTwo);                    //存数据    numOneLen=(int)strlen(numOne);    numTwoLen=(int)strlen(numTwo);    //数据逆序    for (i=0; i<numOneLen/2; i++)    {        tag=numOne[i];        numOne[i]=numOne[numOneLen-1-i];        numOne[numOneLen-1-i]=tag;    }    for (i=0; i<numTwoLen/2; i++)    {        tag=numTwo[i];        numTwo[i]=numTwo[numTwoLen-1-i];        numTwo[numTwoLen-1-i]=tag;    }    //逐位相乘    for (i=0; i<numOneLen; i++)    {        for (j=0; j<numTwoLen; j++)        {            tag=((int)numOne[i]-48)*((int)numTwo[j]-48);            Carrying(tag, i, j, product);                          //递归        }    }    //倒序输出结果    for (i=_MAX * 2 - 1; i>0; i--)    {        if (product[i]!=0)        {            break;                                                          //查找到第一个不等于0的跳出        }    }    for (j=i; j>=0; j--)    {        printf("%d",product[j]);    }    printf("\n");    return 0;}//递归进位函数void Carrying(int tag,int i,int j,int *p){    p[i+j]+=tag;    if (p[i+j]>9)    {        tag=p[i+j]/10;        p[i+j] %=10;        Carrying(tag, i+1, j, p);                                //写成Carrying(tag, i, j+1, p);也成立,为了让i+j递增而已    }    return ;}

题是很水,但是代码还是挺长的……OVER!!!

0 0