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;
}
posted @ 2016-07-04 10:05  see_you_later  阅读(183)  评论(0编辑  收藏  举报