zoukankan      html  css  js  c++  java
  • poj2389 普通的大数乘法

    = =、每次这种题目说只有40位 然而要开到100位,心里总是一万匹草泥马在奔腾;

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    #define LL long long
    const double pi = acos(-1.0);
    #define Len 200005
    #define mod 19999997
    const int INF = 0x3f3f3f3f;
    #define exp 1e-6
    
    int s1[200];
    int s2[200];
    int tep[200];
    int ans[200];
    
    char st1[200];
    char st2[200];
    
    void Init()
    {
        memset(ans,0,sizeof(ans));
        memset(tep,0,sizeof(tep));
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
    }
    
    int init_st1()
    {
        int len,num;
        len=strlen(st1);
        num=0;
        for(int i=len-1;i>=0;i--)
        {
            s1[num++]=st1[i]-'0';       
        }
        return num;
    }
    
    int init_st2()
    {
        int len,num;
        len=strlen(st2);
        num=0;
        for(int i=len-1;i>=0;i--)
        {
            s2[num++]=st2[i]-'0';
        }
        return num;
    }
    
    void add_solve()
    {
        int x,f=0;
        int num=0;
        for(int i=0;i<110;i++)
        {
            x=ans[i]+tep[i];
            x+=f;
            f=x/10;
            ans[num++]=x%10;
        }
        if(f)
            ans[num++]+=f;
    }
    
    void mul_solve(int num,int len,int n)
    {
        int x;
        memset(tep,0,sizeof(tep));
        int f=0;
        for(int i=0;i<len;i++)
        {
            x=s1[i]*n;
            x+=f;
            f=x/10;
            tep[num++]=x%10;
        }
        if(f)
            tep[num++]+=f;
        add_solve();
    }
    
    int main()
    {
        scanf("%s%s",st1,st2);
    
        Init();
        int L1=init_st1();
        int L2=init_st2();
    
        for(int i=0;i<L2;i++)
        {
            mul_solve(i,L1,s2[i]);
        }
    
        int k;
        int flag=0;
        for(int i=150;i>=0;i--)
        {
            if(ans[i])
            {
                flag=1;
                k=i;
                break;
            }
        }
    
        if(!flag)
        {
            printf("0");
            return 0;
        }
    
        for(int i=k;i>=0;i--)
        {
            printf("%d",ans[i]);    
        }
        return 0;
    }
  • 相关阅读:
    LCM与GCD算法
    LCS,LIS,LICS算法
    高精度算法(C/C++)
    SystemTap
    VMware15下解决Ubuntu18.04没有网络连接问题
    Git ssh-key 配置问题
    Ubuntu18.04更换国内源
    sql 错误日志存储路径设置
    资源
    System.Data.DataTable 基本方法
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934492.html
Copyright © 2011-2022 走看看