大树阶乘
#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,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]='\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,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("\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),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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。