2 solutions
-
0
C++ :
#include<iostream> #include<algorithm> #include<string> #include<cctype> using namespace std; const int N(1005); int a[N],b[N],c[N+N],d[N]; string s; //ifstream cin("input.txt"); //ofstream cout("output.txt"); void zhuan(string s,int *c); bool bigger(int *a,int *b); void add(int *a,int *b,int *c); void sub(int *a,int *b,int *c); void mul(int *a,int *b,int *c); void ch10(int *a); //除法用 void jian(int *a,int *b);//除法用 void div(int *a,int *b,int *c); void output(int *c); int main() { while (cin>>s) { fill(a,a+N,0);fill(b,b+N,0);fill(c,c+N,0);fill(d,d+N,0); int p,len; for (p=0,len=s.size();p<len;p++) if (!isdigit(s[p])) break; zhuan(s.substr(0,p),a); zhuan(s.substr(p+1,len-p-1),b); switch (s[p]) { case '+': add(a,b,c); break; case '-': if (bigger(a,b)) sub(a,b,c); else { cout<<"-"; sub(b,a,c); } break; case '*': mul(a,b,c); break; case '/': div(a,b,c); break; } output(c); } return 0; } void zhuan(string s,int *c) { c[0]=s.size(); for (int i=1;i<=c[0];i++) c[i]=s[c[0]-i]-'0'; } bool bigger(int *a,int *b) { if (a[0]!=b[0]) return a[0]>b[0]; for (int i=a[0];i>0;i--) if (a[i]!=b[i]) return a[i]>b[i]; return true; } void add(int *a,int *b,int *c) { c[0]=max(a[0],b[0]); for (int i=1;i<=c[0];i++) { c[i]+=a[i]+b[i]; c[i+1]+=c[i]/10; c[i]%=10; } if (c[c[0]+1]) c[0]++; } void sub(int *a,int *b,int *c) { c[0]=a[0]; for (int i=1;i<=a[0];i++) { c[i]+=a[i]-b[i]; if (c[i]<0) c[i]+=10,c[i+1]--; } while (c[0]>1&&c[c[0]]==0) c[0]--; } void mul(int *a,int *b,int *c) { c[0]=a[0]+b[0]-1; for (int i=1;i<=a[0];i++) for (int j=1;j<=b[0];j++) c[i+j-1]+=a[i]*b[j]; for (int i=1;i<=a[0]+b[0]-1;i++) { c[i+1]+=c[i]/10; c[i]%=10; } if (c[c[0]+1]) c[0]++; } void ch10(int *a) //除法用 { if (a[a[0]]==0) return; for (int i=a[0];i>0;i--) a[i+1]=a[i]; a[1]=0; a[0]++; } void jian(int *a,int *b) //a-=b 除法用 { for (int i=1;i<=a[0];i++) { a[i]-=b[i]; if (a[i]<0) a[i]+=10,a[i+1]--; } while (a[0]>1&&a[a[0]]==0) a[0]--; } void div(int *a,int *b,int *c) //高精度除法 c:商 d:余数 { d[0]=1; d[1]=0; c[0]=a[0]; for (int i=a[0];i>0;i--) { ch10(d); d[1]=a[i]; while (bigger(d,b)) { jian(d,b); c[i]++; } } while (c[c[0]]==0&&c[0]>1) c[0]--; } void output(int *c) { for (int i=c[0];i>0;i--) cout<<c[i]; cout<<endl; }
- 1
Information
- ID
- 594
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 10
- Tags
- # Submissions
- 5
- Accepted
- 0
- Uploaded By