大数问题

大树阶乘

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
char *strrev(char *s)
{
    int i,len;
    char c;
    len=strlen(s);
    if(len%2==0)
    {
        for(i=0;i<=len/2-1;i++)
        {
            c=s[i];s[i]=s[len-1-i];
            s[len-1-i]=c;
        }
    }
    else
    {
        for(i=0;i<len/2;i++)
        {
            c=s[i];s[i]=s[len-1-i];
            s[len-1-i]=c;
        }
    }
    return s;
}
int main()
{
    int n,i,j,cnt,len;
    char s[100000],ans[010000];
    while(scanf("%d",&n)!=EOF)
    {
        strcpy(s,"1");
        for(i=2;i<=n;i++)
        {
            len=strlen(s);
            strrev(s);
            cnt=0;
            for(j=0;j<len;j++)
            {
                int id=(s[j]-'0')*i+cnt;
                    s[j]=(id)%10+'0';
                    cnt=(id)/10;
            }
            while(cnt)
            {
                    s[j++]=cnt%10+'0';
                    cnt=cnt/10;
            }
            s[j]='\0';
            strrev(s);
        }
        cout<<s<<endl;;
    }
    return 0;
}

大数阶乘2:

#include<iostream>
#define MAX 100000
using namespace std;
int main()
{
    int n,a[MAX];
    int i,j,k,count,temp;

    while(cin>>n)
    {
        a[0]=1;
        count=1;
        for(i=1;i<=n;i++)
        {
            k=0;
            for(j=0;j<count;j++)
            {
                temp=a[j]*i+k;
                a[j]=temp%10;
                k=temp/10;
            }
            while(k)//记录进位
             {
                a[count++]=k%10;
                k/=10;
            }
        }
        for(j=MAX-1;j>=0;j--)
            if(a[j])
                break;//忽略前导0
            for(i=count-1;i>=0;i--)
                cout<<a[i];
            cout<<endl;
    }
    return 0;
}


大数加法1:

#include<string.h>
#include<iostream>
#include<algorithm>

using namespace std;
char* strrev(char *s)
{
    int i,len;
    char c;
    len=strlen(s);
    if(len/2==0)
    {
        for(i=0;i<len/2-1;i++)
        {
            c=s[i];
            s[i]=s[len-1-i];
            s[len-1-i]=c;
        }
    }
    else
    {
        for(i=0;i<len/2;i++)
        {
            c=s[i];
            s[i]=s[len-1-i];
            s[len-1-i]=c;
        }
    }
    return s;

}
int main()
{
    int t,i,j,len1,len2,k,r;
    char s1[1000],s2[1000],s[1000];
    cin>>t;
    for(k=1;k<=t;k++)
    {
        cin>>s1>>s2;
        len1=strlen(s1);
        len2=strlen(s2);
        strrev(s1);
        strrev(s2);
        i=0;j=0;r=0;
        int cnt=0,tem;
        while(i<len1||j<len2)
        {
            if(i<len1&&j<len2)
                tem=s1[i]-'0'+s2[j]-'0'+cnt;
            if(i<len1&&j>=len2)
                tem=s1[i]-'0'+cnt;
            if(i>=len1&&j<len2)
                tem=s2[j]-'0'+cnt;
            s[r++]=tem%10+'0';
            cnt=tem/10;
            i++;j++;
        }
        if(cnt)
            s[r++]=cnt+'0';
        s[r]='\0';
        strrev(s1);strrev(s2);strrev(s);
        cout<<"Case "<<k<<":"<<endl;
        cout<<s1<<' '<<"+"<<' '<<s2<<' '<<"="<<' '<<s<<endl;
        if(k!=t)
            cout<<endl;
    }
    return 0;
}

大数加法2:

#include <stdio.h>
#include <string.h>
int main()
{
    char a[1000],b[1000];
    int n,i,j,l1,l2,max;
    scanf("%d",&n);
    j=0;
    while( n-- )
    {
        int c[1000]= {0};
        int d[1000]= {0};
        scanf("\n%s%s",a,b);
        l1 = strlen(a);
        l2 = strlen(b);
        if(l1 > l2)
            max = l1;
        else
            max = l2;
        for(i = l1-1; i >= 0; i--)
            c[l1-i] = a[i] - '0';
        for(i = l2-1; i >= 0; i--)
            d[l2-i] = b[i] - '0';
        for(i = 1; i <= max; i++)
        {
            c[i] = c[i] + d[i];
            if( c[i] > 9)
            {
                if( i == max)
                    max++;
                c[i+1]++;
                c[i] = c[i] - 10;
            }
        }
        printf("Case %d:\n",++j);
        printf("%s + %s = ",a,b);
        for(i = max; i > 0; i--)
            printf("%d",c[i]);
        if( n != 0)
            printf("\n\n");
        else
            printf("\n");
    }
    return 0;
}

大数除法:

高精度除低精度求商模板*/大数除法 ------除数为int范围

#include<iostream>
#include<stdio.h>
#include<string.h>
#define N 1000
using namespace std;
void division(char * src,int n)
{
    int len = strlen(src),i,k,t=0,s=0;
    char dest[N];
    bool flag = true;    //商是否有了第一个有效位,防止商首部一直出现0
    for(i=0,k=0; i<len; i++)
    {
        t = s*10+(src[i]-48);    //新余数
        if(t/n>0 || t==0)        //余数为0要修改商
        {
            dest[k++] = t/n+48,s = t%n,flag = false;
        }
       else                    //不够除,修改余数
        {
            s = t;
            if(!flag)            //商已经有有效位了,补零
                dest[k++] = '0';
        }
    }
       for(i=0;i<k;i++)
         cout<<dest[i];
         cout<<endl;
}
int main()
{
  char num[N];
  int n;
  while(scanf("%s%d",num,&n)!=EOF)
  {
      division(num,n);
  }
return 0;
}
大数求余:大数取余-------mod  X  ,X为 (int范围)

 具体做法:

   从大数最高位开始,只要其大于mod
   就实行取余,一直下去,最终得到余数
例如:123 % 4  取一个中间变量t=0
      1<4  t=1
    --- 2  t=1*10+2=12>4  t=t%4=0
    --- 3  t=0+3=3        t=t%4=3
    --------------------  余数 3

#include<iostream>
#include<string>
#include<cstring>
using namespace std;

int MOD(string a,int mod)
{
 int len=a.length(),i;
 int t=0;//中间变量,最终存储余数
 for(i=0;i<len;i++)
 {
    t*=10;
    t+=a[i]-'0';
    if(t>=mod)
        t=t%mod;
 }
  return t;
}
int main()
{
    string a;
    int mod;
  while(cin>>a>>mod)
  {
    cout<<MOD(a,mod)<<endl;
  }
 return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值