大数运算总结
发布时间:2020-12-14 02:26:31 所属栏目:大数据 来源:网络整理
导读:大数求和 #include stdio.h#include string.h#define max 3000char a[max],b[max],c[max];int main(){int i,j,k,s,x,y,z;while(~scanf("%s%s",a,b)){i=strlen(a)-1;j=strlen(b)-1;k=s=0;while(i=0||j=0){if(i0)x=0;elsex=a[i]-'0';if(j0)y=0;elsey=b[j]-'0';
大数求和 #include <stdio.h> #include <string.h> #define max 3000 char a[max],b[max],c[max]; int main(){ int i,j,k,s,x,y,z; while(~scanf("%s%s",a,b)){ i=strlen(a)-1; j=strlen(b)-1; k=s=0; while(i>=0||j>=0){ if(i<0) x=0; else x=a[i]-'0'; if(j<0) y=0; else y=b[j]-'0'; z=x+y; if(s) z++; if(z>9){ s=1; z%=10; } else s=0; c[k++]=z+'0'; i--; j--; } if(s) c[k++]='1'; for(i=k-1;i>=0;i--) putchar(c[i]); printf("n"); } return 0; } 大数相减
#include <stdio.h> #include <string.h> #define max 300 char a[max],d[max]; int c[max]; int main(){ int i,z,flag; while(~scanf("%s%s",b)){ memset(c,sizeof(c)); k=flag=0; if(strcmp(a,b)==0){ printf("0n"); continue; } if(strcmp(a,b)<0){ flag=1; strcpy(d,a); strcpy(a,b); strcpy(b,d); } i=strlen(a)-1; j=strlen(b)-1; while(i>=0||j>=0){ if(i<0) x=0; else x=a[i]-'0'; if(j<0) y=0; else y=b[j]-'0'; z=x-y; c[k++]=z; i--; j--; } for(i=0;i<k;i++){ if(c[i]<0){ c[i]+=10; c[i+1]--; } } if(flag) printf("-"); flag=0; for(i=k-1;i>=0;i--){ if(!flag&&c[i]==0) continue; flag=1; printf("%d",c[i]); } printf("n"); } return 0; } 大数相乘
#include <stdio.h> #include <string.h> #define max 3000 char a[max],s[max]; int ans[max][max],t[max]={0}; void mul(){ int i,lena,lenb,k; lena=strlen(a);lenb=strlen(b); for(i=lena-1;i>=0;i--){ for(j=lenb-1;j>=0;j--) ans[lena-1-i][lenb-1-j]=(a[i]-'0')*(b[j]-'0'); } for(i=0;i<lena+lenb-1;i++){ if(i>=lenb) j=i-lenb+1; else j=0; for(;j<=i&&j<lena;j++) t[i]+=ans[j][i-j]; if(t[i]>=10){ t[i+1]=t[i]/10; t[i]%=10; } } if(t[lena+lenb-1]) k=lena+lenb-1; else k=lena+lenb-2; for(i=k;i>=0;i--) s[k-i]=t[i]+'0'; s[k+1]=' '; } int main(){ while(~scanf("%s%s",b)){ memset(t,sizeof(t)); mul(); puts(s); } return 0; } 大数乘小数
#include <stdio.h> #include <string.h> char a[3000]; int b[3000]; int main() { int len,add,i,n,flag,k; while(~scanf("%s%d",&n)) { len=strlen(a); add=flag=0; for(i=0;i<len;i++) b[len-i-1]=a[i]-'0'; for(i=0;i<len;i++){ k=b[i]*n+add; if(k>=10){ b[i]=k%10; add=k/10;flag=1; } else{ b[i]=k; flag=0; add=0; } } if(flag){ len=i+1; b[i]=add; } for(i=len-1;i>=0;i--) printf("%d",b[i]); printf("n"); } return 0; } ? #include <stdio.h> #include <string.h> #define max 3000 int a[max]; int main(){ int len,c; while(~scanf("%d",&n)){ memset(a,sizeof(a)); a[0]=1; len=1;//表示位数 for(i=2;i<=n;i++){ c=0;//表示进位的数值 for(j=0;j<len;j++){ s=a[j]*i+c; c=s/10; a[j]=s%10; } while(c){ a[j++]=c%10; c/=10; len++; } } for(i=len-1;i>=0;i--) printf("%d",a[i]); printf("n"); } return 0; } Sample Input
#include<stdio.h> #include<string.h> #define MAXN 1002 int a[MAXN],c[MAXN],last[MAXN]; // a是存储整型的被除数,c是存储得数,last存储的是每次相除后(其实是相减)的余数 char s[MAXN]; //存储输入的被除数 int dealb(int (*b)[20],char *d) // 求出 除数*n 的每个值并存于数组b中(n = 1 2 3 4 ..... 9) { int len = strlen(d),e,temp,t; for(i=0; i<len; ++i) for(j=1; j<10; ++j) b[j][i+1] = d[len-1-i] - '0'; b[1][0] = len; for(i=2; i<10; i++) //大数相乘 { e = 0; for(t=1; t<len+1; ++t) { temp = i*b[i][t] + e; b[i][t] = temp%10; e = temp/10; } if(e) b[i][t++] = e; b[i][0] = t-1; } return 0; } int cmp(int (*b)[20],int n) // 从上到下筛选dealb函数得到的数组,返回的值是得数的依次低位数, { //n存储的是余数数组或者说除数依次高位向下的数个数和最高下标 int i,t,flag; for(k=0; k<n && last[k]==0; ++k); for(i=9; i>0; --i)// 两个数比较的三种情况 { if(b[i][0] > n-k+1) continue; // 位数不相同情况之一,减数较大则继续找下一位 if(b[i][0] < n-k+1) return i; // 位数不相同情况之二,减数较小则返回减数的所在的下标,这个值也是得数的当前最低位数 for(j=b[i][0],t=k,flag=0; t<=n && j>0 && b[i][j] == last[t]; ++t,--j) //位数相同的,逐个位权的数进行比较 ; if(t>n || j<=0 || b[i][j] < last[t]) return i; } return 0; } int main() { int i,len,count = 0,loc,h; int b[12][20]; // b[i]存储的除数*i的值(i=1 2 3...9),每个第一位即b[i][0]存储该值的长度 char opt,d[20]; while(scanf("%s",s) != EOF) { while((opt = getchar()) == ' '); scanf("%s",d); dealb(b,d); len = strlen(s); for(i=0; i<len; ++i) a[i] = s[i] - '0'; count = loc = h = 0; for(i=0; i<len; ++i) { last[count++] = a[i]; if((loc = cmp(b,count-1)) != 0) { for(t=count-1,j=1,e=0; t>=0 && j<=b[loc][0]; --t,++j)// 从cmp得到的信息保证了b[1oc] - last >=0,此处进行相减运算 { if((temp = last[t]-b[loc][j] + e) < 0) { e = -1; last[t] = 10 + temp; } else { e = 0; last[t] = temp; } } if(j>b[loc][0] && t>=0) { for(; t>=0; --t) { temp = last[t] + e; if(temp < 0) e = -1,last[t] = 10+temp; else e = 0,last[t] = temp; } } } c[h++] = loc; } if(opt == '/') { for(i=0; i<h-1 && c[i] == 0; ++i); // 除去前缀零 for(; i<h; ++i) printf("%d",c[i]); } else { for(i=0; i<count-1 && last[i] == 0; ++i); for(; i<count; ++i)printf("%d",last[i]); } printf("n"); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |