大数问题

来源:互联网 发布:无人机用什么语言编程 编辑:程序博客网 时间:2024/05/18 01:17

大树阶乘

#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 100000using 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 1000using 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
原创粉丝点击