3 solutions
-
6
知道我修改错误有多累吗?
#include<bits/stdc++.h> using namespace std; int a[501],b[501],c[501],d,i; void init(int a[]){ string s; cin>>s; a[0]=s.length(); for(i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; } void print(int a[]){ int i; if(a[0]==0){ cout<<0<<endl; return; } for(i=a[0];i>0;i--) cout<<a[i]; cout<<endl; return; } int compare(int a[],int b[]){ int i; if(a[0]>b[0]) return 1; if(a[0]<b[0]) return -1; for(i=a[0];i>0;i--){ if(a[i]>b[i]) return 1; if(a[i]<b[i]) return -1; } return 0; } void jian(int a[],int b[]) { int flag,i; flag=compare(a,b); if(flag==0){ a[0]=0; return; } if(flag==1){ for(i=1;i<=a[0];i++){ if(a[i]<b[i]){ a[i+1]--; a[i]+=10; } a[i]-=b[i]; } while(a[0]>0&&a[a[0]]==0) a[0]--; return; } } void numcpy(int p[],int q[],int det){ for(int i=1;i<=p[0];i++) q[i+det-1]=p[i]; q[0]=p[0]+det-1; } void chugao(int a[],int b[],int c[]){ int i,tmp[501]; c[0]=a[0]-b[0]+1; for(i=c[0];i>0;i--){ memset(tmp,0,sizeof(tmp)); numcpy(b,tmp,i); while(compare(a,tmp)>=0){ c[i]++; jian(a,tmp); } } while(a[0]>0&&c[c[0]]==0) c[0]--; return; } int main(){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); init(a); init(b); if(compare(a,b)==-1) cout<<0<<endl; chugao(a,b,c); print(c); print(a); return 0; }
点个赞吧
-
3
超短、简洁
注释版:
#include<bits/stdc++.h> using namespace std; string x,y; int a[350],b[350],c[350],d[350],la,lb; bool pd(int last,int len){//判断是否可除(减) for(int k = last + len; k < 350; k++)if(d[k] != 0)return true; for(int i = len-1 ; i >= 0 ; i--) { if(d[last + i]>b[i])return true; if(d[last + i]<b[i])return false; } return true; } void div(){ //思路:不断对被除数减除数,减的次数就是商,剩下的就是余数。 for(int i = la - lb ; i >= 0 ; i-- ){//c为商,d为余数 while(pd ( i , lb ) ){ for(int j=0 ; j < lb ; j++ ){ d[i + j]-=b[j]; if(d[i + j]<0){ //d的退位 d[i + j + 1]--; d[i + j] += 10; } } c[i]++; for(int j = i ; j < 350 && c[j] >= 10 ; j++){//c的进位 c[j + 1] += c[j] / 10; c[j]%=10; } } } } int main(){ cin>>x>>y; la = x.size(); lb = y.size(); //字符串长度即为位数 for(int i = 0 ; i<la; ++i)a[la-i-1]=d[la-i-1]=x[i]-'0'; for(int i = 0 ; i<lb; ++i)b[lb-i-1]=y[i]-'0'; div(); bool f=false;//f判断当前为是否为前导 for(int i = 349 ; i >= 0 ; i--){ if(c[i] != 0 || f){ f=true; cout<<c[i]; } } if(!f){//如果全为0不会输出 cout<<0; } cout<<endl; f=false; for(int i = 349 ; i >= 0 ; i--){ if(d[i] !=0 || f){ f=true; cout<<d[i]; } } if(!f){ cout<<0; } return 0; }
压行版:
#include<bits/stdc++.h> std::string x,y; int a[350],b[350],c[350],d[350],la,lb; bool pd(int last, int len){ for(int k=last+len;k<350;++k)if(d[k]!=0)return true; for(int i=len-1;i>=0;i--){ if(d[last+i]>b[i])return true; if(d[last+i]<b[i])return false; }return true; }void div(){ for(int i=la-lb;i>=0;i--)while(pd(i,lb)){ for(int j=0;j<lb;j++){ d[i+j]-=b[j]; if(d[i+j]<0)d[i+j+1]--,d[i+j]+=10; }c[i]++; for(int j=i;j<350&&c[j]>=10;++j)c[j+1]+=c[j]/10,c[j]%=10; } }int main(){ std::cin>>x>>y; la=x.size(),lb=y.size(); for(int i=0;i<la;++i)a[la-i-1]=d[la-i-1]=x[i]-'0'; for(int i=0;i<lb;++i)b[lb-i-1]=y[i]-'0'; div(); bool f=false; for(int i=349;i>=0;i--)if(c[i]!=0||f||i==0)f=true,std::cout<<c[i]; f=false; for(int i=349;i>=0;i--)if(d[i]!=0||f||i==0)f=true,std::cout<<d[i]; return 0; }
ppp版:
#include<bits/stdc++.h> using namespace std; string x,y; int pppp[350],c[350],ppp[350],la,lb; bool pd(int last, int len){ for(int p=last+len;p<350;p++)if(ppp[p]!=0)return true; for(int p=len-1;p>=0;p--){ if(ppp[last+p]>pppp[p])return true; if(ppp[last+p]<pppp[p])return false; } return true; } void div(){ for(int p=la-lb;p>=0;p--)while(pd(p,lb)){ for(int pp=0;pp<lb;pp++){ ppp[p+pp]-=pppp[pp]; if(ppp[p+pp]<0)ppp[p+pp+1]--,ppp[p+pp]+=10; } c[p]++; for(int pp=p;pp<350&&c[pp]>=10;pp++)c[pp+1]+=c[pp]/10,c[pp]%=10; } } int main() { cin>>x>>y; la=x.size(),lb=y.size(); for(int p=0;p<la;++p)ppp[la-p-1]=x[p]-'0'; for(int p=0;p<lb;++p)pppp[lb-p-1]=y[p]-'0'; div(); bool f=false; for(int p=349;p>=0;p--)if(c[p]!=0||f)f=true,cout<<c[p]; if(!f)cout<<0; cout<<endl; f=false; for(int p=349;p>=0;p--)if(ppp[p]!=0||f)f=true,cout<<ppp[p]; if(!f)cout<<0; return 0; }
知道我加注释/改错有多累吗,还不快快点赞!!!
-
-2
一本通的标准答案
#include #include #include using namespace std; int a[301],b[301],c[301],d;
void init(int a[]) { string s; cin >> s; a[0]=s.length(); for(int i=1;i<=a[0];i++) { a[i]=s[a[0]-i]-'0'; } }
void print(int a[]) { int i; if(a[0]==0) { cout<<0<<endl; return; } for(int i=a[0];i>0;i--) { cout << a[i]; } cout <<endl; return; }
int compare(int a[],int b[]) { if(a[0]>b[0]){ return 1; } if(a[0]<b[0]){ return -1; } for(int i=a[0];i>0;i--) { if(a[i]>b[i]) return 1; if(a[i]<b[i]) return-1; } return 0; }
void jian(int a[],int b[]) { int flag; flag=compare(a,b); if(flag0){ a[0]=0; return; } if (flag1) { for(int i=1;i<=a[0];i++) { if(a[i]<b[i]){ a[i+1]--; a[i]+=10; } a[i]-=b[i]; } while(a[0]>0 && a[a[0]]==0){ a[0]--; } return; } }
void numcpy(int p[],int q[],int det) { for(int i=1;i<=p[0];i++){ q[i+det-1]=p[i]; } q[0]=p[0]+det-1; }
void chugao(int a[],int b[],int c[]) { int i,tmp[101]; c[0]=a[0]-b[0]+1; for(i=c[0];i>0;i--){ memset(tmp,0,sizeof(tmp)); numcpy(b,tmp,i); while(compare(a,tmp)>=0) { c[i]++;jian(a,tmp); } } while(c[0]>0 && c[c[0]]==0) { c[0]--; } return; }
int main(){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); init(a); init(b); chugao(a,b,c); print(c); print(a); return 0; }
- 1
Information
- ID
- 793
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 66
- Accepted
- 27
- Uploaded By