蓝桥杯 P1001(大数乘法)

来源:互联网 发布:英雄联盟观战软件 编辑:程序博客网 时间:2024/06/08 03:13
 算法提高 P1001  
时间限制:1.0s   内存限制:256.0MB
    
  
  当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.

输入:
  62773417 12345678

输出:
  774980393241726


#include<stdio.h>#include<string.h>char s1[20],s2[20];int a1[20],a2[20],result[25];int l1,l2;void mul(){    memset(result,0,sizeof(result));    //实现乘法    for(int i=0; i<l1; i++)        for(int j=0; j<l2; j++)        {            result[i+j]+=a1[i]*a2[j];        }    //进位处理    for(int i=0; i<l1+l2-1; i++)    {        result[i+1]+=result[i]/10;        result[i]%=10;    }    if(result[l1+l2-1]!=0)//注意判断        printf("%d",result[l1+l2-1]);    for(int i=l1+l2-2; i>=0; i--)        printf("%d",result[i]);    printf("\n");}int main(){    scanf("%s%s",s1,s2);//运用字符串读入    //将各个字符所代表的数按照数字存入数组中    memset(a1,0,sizeof(a1));    l1=strlen(s1);    for(int i=0; i<l1; i++)    {        a1[l1-1-i]=s1[i]-'0';    }    memset(a2,0,sizeof(a2));    l2=strlen(s2);    for(int i=0; i<l2; i++)    {        a2[l2-1-i]=s2[i]-'0';    }    if(((l1==1)&&(a1[0]==0))||((l2==1)&&(a2[0]==0)))//注意把至少有一个乘数为0的情况单独拿出来考虑        printf("0\n");    else        mul();    return 0;}


2 0
原创粉丝点击