加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数问题

发布时间:2020-12-14 02:38:26 所属栏目:大数据 来源:网络整理
导读:大树阶乘 #includestdio.h#includeiostream#includealgorithm#includemath.h#includestring.husing 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]=

大树阶乘

#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]='';
            strrev(s);
        }
        cout<<s<<endl;;
    }
    return 0;
}

大数阶乘2:

#include<iostream>
#define MAX 100000
using namespace std;
int main()
{
    int n,a[MAX];
    int i,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,len1,len2,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]='';
        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,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 = ",b);
        for(i = max; i > 0; i--)
            printf("%d",c[i]);
        if( n != 0)
            printf("nn");
        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),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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读