• 两个很大的数相乘


    #include <iostream>
    #include<string.h>
    #include<stdlib.h>
    #include<stdio.h>
    using namespace std;
    const int maxN=200;
    char s1[maxN],s2[maxN];
    int a[maxN],b[maxN];
    int **ans=new int*[maxN];
    int ret[2*(maxN+1)];
    int main()
    {
        int len1,len2,i,j,k,k1,k2,num,sum,over;
        while(scanf("%s%s",s1,s2)!=EOF)
        {
            len1=strlen(s1);
            len2=strlen(s2);
            k1=0;
            for(i=len1-1; i>=0; i-=4)
            {
                sum=0;
                for(j=i; j>i-4&&j>=0; j--)
                {
                    num=s1[j]-'0';
                    for(k=i-j; k>0; k--)
                        num*=10;
                    sum+=num;
                }
                a[k1++]=sum;
            }
            k2=0;
            for(i=len2-1; i>=0; i-=4)
            {
                sum=0;
                for(j=i; j>i-4&&j>=0; j--)
                {
                    num=s2[j]-'0';
                    for(k=i-j; k>0; k--)
                        num*=10;
                    sum+=num;
                }
                b[k2++]=sum;
            }
    
            /*
            for(i=k1-1; i>=0; i--)
                cout<<a[i]<<" ";
            cout<<endl;
            for(i=k2-1; i>=0; i--)
                cout<<b[i]<<" ";
            cout<<endl;
            */
            for(i=0; i<maxN; i++)
            {
                ans[i]=new int[2*(maxN+1)];
                memset(ans[i],0,sizeof(int)*2*(maxN+1));
            }
            for(i=0; i<k1; i++)
            {
                over=0;
                k=i;//expansion 10^(4*i)
                for(j=0; j<k2; j++,k++)
                {
                    ans[i][k]=a[i]*b[j]+over;
                    over=ans[i][k]/10000;
                    ans[i][k]%=10000;
                }
                if(over)
                    ans[i][k]=over;
            }
            /*
            for(i=0; i<k1; i++)
            {
                for(j=2*(maxN+1)-1; j>=0; j--)
                    if(ans[i][j])
                        break;
                if(j==-1)
                {
                    printf("0
    ");
                    continue;
                }
                printf("i= %d , j= %d , ans[i][j] = %d
    ",i,j,ans[i][j]);
                for(j-=1; j>=0; j--)
                    printf("%04d",ans[i][j]);
                printf("
    ");
            }
            */
            memset(ret,0,sizeof(ret));
            for(i=0; i<k1; i++)
            {
                over=0;
                for(j=0; j<2*(maxN+1); j++)
                {
                    ret[j]+=ans[i][j]+over;
                    over=ret[j]/10000;
                    ret[j]%=10000;
                }
            }
            for(i=2*(maxN+1)-1; i>=0; i--)
                if(ret[i])
                    break;
            if(i==-1)
            {
                printf("0
    ");
                continue;
            }
            printf("%d",ret[i]);
            for(i-=1; i>=0; i--)
            {
                printf("%04d",ret[i]);
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    算法设计和分析(Prim算法构建最小生成树)
    寒假第二阶段集训第6天
    2.4 综合训练
    1月18日 LCA专项训练
    易班易喵喵话题动态自动统计
    P2590 [ZJOI2008]树的统计
    P3038 [USACO11DEC]牧草种植Grass Planting
    2157: 旅游
    P2787 语文1(chin1)- 理理思维
    F. Make Them Similar
  • 原文地址:https://www.cnblogs.com/heqinghui/p/4850822.html
Copyright © 2020-2023  润新知