加法
#include <stdio.h> #include <string.h> #include <stdlib.h> void add(char a[],char b[],char back[]) { int i,j,k,up,x,y,z,l; char *c; if(strlen(a) > strlen(b)) l = strlen(a)+2; else l = strlen(b)+2; c = (char*)malloc(l*sizeof(char)); i = strlen(a)-1; j = strlen(b)-1; k = 0; up = 0; while(j>=0 || i>=0) { if(i<0) x = '0'; else x = a[i]; if(j<0) y = '0'; else y = b[j]; z = x-'0'+y-'0'; if(up) z++; if(z>9) { up = 1; z%=10; } else up = 0; c[k++] = z+'0'; i--; j--; } if(up) c[k++] = '1'; i = 0; c[k] = '\0'; for(k-=1; k>=0; k--) back[i++] = c[k]; back[i] = '\0'; } int main() { char c[10000],t[10000],sum[1000]; int m; scanf("%d%*c",&m); while(m--) { scanf("%s%s",c,t); add(c,t,sum); printf("%s\n",sum); if(m) printf("\n"); } return 0; }
大数相乘
#include <stdio.h> #include <string.h> void mult(char a[],char b[],char s[]) { int i,j,k = 0,alen,blen,sum = 0,res[65][65]={0},flag = 0; char result[65]; alen = strlen(a); blen = strlen(b); for(i = 0;i<alen;i++) { for(j = 0;j<blen;j++) res[i][j] = (a[i]-'0')*(b[j]-'0'); } for(i = alen-1;i>=0;i--) { for(j = blen-1;j>=0;j--) { sum = sum+res[i+blen-j-1][j]; printf("res = %d\n",res[i+blen-j-1][j]); } result[k] = sum%10; k++; sum = sum/10; } for(i = blen-2;i>=0;i--) { for(j = 0;j<=i;j++) { sum = sum+res[i-j][j]; } result[k] = sum%10; k++; sum = sum/10; } if(sum) { result[k] = sum; k++; } for(i = 0;i<k;i++) result[i]+='0'; for(i = k-1;i>=0;i--) s[i] = result[k-1-i]; s[k] = '\0'; while(1) { if(strlen(s)!=strlen(a) && s[0] == '0') strcpy(s,s+1); else break; } } int main() { char c[1000],t[1000],sum[1000]; int m; while(~scanf("%s%s",c,t)) { mult(c,t,sum); printf("%s\n",sum); } return 0; }
大数乘以小数
#include <stdio.h> #include <string.h> void mult(char c[],int m,char t[]) { char s[100]; int len=strlen(c); for(int i=0; i<len; i++) s[len-i-1]=c[i]-'0'; int flag,add=0; for(int i=0; i<len; i++) { int k=s[i]*m+add; if(k>=10) { s[i]=k%10; add=k/10; flag=1; } else { s[i]=k; add=0; flag=0; } } while(add) { s[len++]=add%10; add/=10; } for(int i=0; i<len; i++) t[len-1-i]=s[i]+'0'; t[len]='\0'; } //大数加小数 void addt(char a[],int b,char c[]) { int len=strlen(a); char s[100]; for(int i=0; i<len; i++) s[len-i-1]=a[i]-'0'; int add=0; for(int i=0;; i++) { if(i>=len) { s[i]=0; len++; } int k=s[i]+b%10+add; b/=10; if(k>=10) { s[i]=k%10; add=k/10; } else { s[i]=k; add=0; } if(b==0&&add==0)break; } for(int i=0; i<len; i++) c[len-1-i]=s[i]+'0'; c[len]='\0'; } int main() { char c[1000],t[1000],sum[1000]; int m; while(~scanf("%s%d",c,&m)) { mult(c,m,t); printf("%s\n",t); addt(c,m,sum); printf("%s\n",sum); } return 0; }
大数减法
#include <stdio.h> #include <string.h> void sub(char s1[],char s2[],char t[]) { int i,l1,l2,k; l2 = strlen(s2); l1 = strlen(s1); t[l1] = '\0'; l1--; for(i = l2-1; i>=0; i--,l1--) { if(s1[l1]-s2[i]>=0) t[l1] = s1[l1] - s2[i] + '0'; else { t[l1] = 10+s1[l1] - s2[i]+'0'; s1[l1-1]= s1[l1-1] -1; } } k = l1; while(s1[k]<0) { s1[k]+=10; s1[k-1]-=1; k--; } while(l1>=0) { t[l1] = s1[l1]; l1--; } loop: if(t[0] == '0') { l1 = strlen(s1); for(i = 0; i<l1-1; i++) t[i] = t[i+1]; t[l1-1] = '\0'; goto loop; } if(strlen(t) == 0) { t[0] = '0'; t[1] = '\0'; } } int main() { char c[1000],t[1000],sum[1000]; int m; while(~scanf("%s%s",c,t)) { sub(c,t,sum); printf("%s\n",sum); } return 0; }
大数阶乘
#include<iostream> #include<cmath> using namespace std; int main() { void factorial(int n,int *) ; int b[10000]; int n; while(cin>>n) { factorial(n,b); } return 0; } void factorial(int n,int b[10000]) { long a[10000]; int i,j,l,c,m=0,w; a[0]=1; for(i=1; i<=n; i++) { c=0; for(j=0; j<=m; j++) { a[j]=a[j]*i+c; c=a[j]/10000; a[j]=a[j]%10000; } if(c>0) { m++; a[m]=c; } } w = m*4+log10(a[m])+1; cout << w << endl; cout<<a[m]; for(i=m-1; i>=0; i--) cout<<a[i]; cout<<endl; }
进制转换
#include <stdio.h> #include <string.h> void consversion(char s[],char s2[],long d1,long d2) { long i,j,t,num; char c; num = 0; for(i = 0;s[i]!='\0';i++) { if(s[i]<='9' && s[i]>='0') t = s[i] - '0'; else t = s[i] - 'A' +10; num = num*d1+t; } i = 0; while(1) { t = num%d2; if(t<=9) s2[i] = t+'0'; else s2[i] = t+'A'-10; num/=d2; if(num == 0) break; i++; } for(j = 0;j<i/2;j++) { c = s2[j]; s2[j] = s[i-j]; s2[i-j] = c; } s2[i+1]='\0'; } int main() { char s1[1000],s2[1000]; int d1,d2; while(~scanf("%s%d%d",s1,&d1,&d2)) { consversion(s1,s2,d1,d2); printf("%s\n",s2); } return 0; }