码迷,mamicode.com
首页 > 编程语言 > 详细

c++大数

时间:2019-01-08 15:10:53      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:can   nbsp   函数   乘法   big   color   交换   min   阶乘   

乘法

string mul(string a,string b)

{

    reverse(a.begin(),a.end());//交换顺序,方便计算

    reverse(b.begin(),b.end());

    int len1=a.size();

    int len2=b.size();

    for(int i = 0;i < len1;++i)

        for(int j = 0;j < len2;++j)

            t[i+j]=(a[i]-‘0‘)*(b[j]-‘0‘)+t[i+j];//先整体乘起来,不进位

    int over=0;

    for(int i = 0;i < len1+len2;++i)//进位

    {

        t[i]+=over;

        over=0;

        if(t[i]>=10)

        {

            over=t[i]/10;

            t[i]%=10;

        }

    }

    string c;

    for(int i = 0;i < len1+len2;++i)

    {

        c+=(t[i]+‘0‘);

    }

    return c;

}

减法(只允许正数):

string sub(string a,string b)

{

    string now;

    now.erase(0);

    if(cmp(a,b))//比较a,b谁长

    {

        string c;

        c=a;

        a=b;

        b=c;

        now+=‘-‘;

    }

    int len1=a.size();

    int len2=b.size();

    reverse(a.begin(),a.end());

    reverse(b.begin(),b.end());

    int over=0;

    int len=min(len1,len2);

     char c;

    for(int i = 0;i < len;++i)//减去短的数

    {

        c=a[i]-b[i]+over;

        over=0;

        if(c<0)

        {

            c+=10;

            over=-1;

        }

        c=c+‘0‘;

        now+=c;

    }

    for(int i = len;i < len1;++i)加上长的数的后面的部分

    {

        c=a[i]-‘0‘+over;//记得进位

        over=0;

        if(c<0)

        {

            over=-1;

            c+=10;

        }

        c=c+‘0‘;

        now+=c;

    }

    if(now[0]==‘-‘)//负号处理

    reverse(now.begin()+1,now.end());

    else

        reverse(now.begin(),now.end());

    return now;

}

bool cmp(string a,string b)//比较函数

{

    if(a.size()>b.size())

        return false;

    else if(a.size()==b.size())

    {

        for(int i = 0;i < a.size();++i)

        {

            if(a[i]==b[i])

                continue;

            else if(a[i]>b[i])

                return false;

            else

                return true;

        }

    }

    else

        return true;

}

 大数阶乘(hdu1042):

#include <stdio.h>
#include <cstring>
#include <string>
#include <stdlib.h>
using namespace std;
int a[100005];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        a[1]=1;
        int wei=1;
        for(int i = 1;i <= n;++i)
        {
            int over=0;
            for(int j = 1;j <= wei;++j)
            {
                a[j]=i*a[j]+over;
                over=a[j]/10;
                a[j]=a[j]%10;
            }
            while(over>0)
            {
                wei++;
                a[wei]=over%10;
                over=over/10;
            }
        }
        for(int i = wei;i >= 1;--i)
            printf("%d",a[i]);
        printf("\n");
    }
    return 0;
}
大数求余

LL bigmod(string a,LL b)


{


    int len=a.size();


    LL ans=0;


    for(int i=0;i<len;++i)


        ans=(ans*10%b+a[i]-‘0‘)%b;


    return ans;


}

 

c++大数

标签:can   nbsp   函数   乘法   big   color   交换   min   阶乘   

原文地址:https://www.cnblogs.com/aaddvvaanntteezz/p/10238097.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!