很簡單,直接作就好了函數
string S; struct GJ{ int s[N],L; void Print() { for(int i=L;i>1;--i) printf("%d",s[i]); printf("%d\n",s[1]); } }blank,A,B,Ans; GJ operator +(GJ X,GJ Y) { GJ mid=blank; mid.L=max(X.L,Y.L); for(int i=1;i<=mid.L;++i) { mid.s[i]+=X.s[i]+Y.s[i]; mid.s[i+1]+=mid.s[i]/10; mid.s[i]%=10; } if(mid.s[mid.L+1])mid.L++; return mid; } int main() { cin>>S;A.L=S.length(); for(int i=0;i<A.L;++i) A.s[A.L-i]=S[i]-'0'; cin>>S;B.L=S.length(); for(int i=0;i<B.L;++i) B.s[B.L-i]=S[i]-'0'; Ans=A+B; Ans.Print(); return 0; }
注意一下判斷高精的大小關係
我偷懶就直接用string的庫函數了。。。優化
string S1,S2; struct GJ{ int s[N],L; void Print() { for(int i=L;i>1;--i) printf("%d",s[i]); printf("%d\n",s[1]); } }blank,A,B,Ans; GJ operator -(GJ X,GJ Y) { GJ mid=blank; mid.L=max(X.L,Y.L); for(int i=1;i<=mid.L;++i) { mid.s[i]+=X.s[i]-Y.s[i]; if(mid.s[i]<0) mid.s[i+1]--,mid.s[i]+=10; } while(!mid.s[mid.L]&&mid.L>1)mid.L--; return mid; } int main() { bool flag=0; cin>>S1;A.L=S1.length(); cin>>S2;B.L=S2.length(); if(A.L<B.L||(A.L==B.L&&S1<S2)) { swap(S1,S2); swap(A.L,B.L),flag=1; } for(int i=0;i<A.L;++i) A.s[A.L-i]=S1[i]-'0'; for(int i=0;i<B.L;++i) B.s[B.L-i]=S2[i]-'0'; Ans=A-B; if(flag)putchar('-'); Ans.Print(); return 0; }
小數的話先把小數點摳出來,在答案里加進去就ok
負數的話特判一下就能夠了spa
char S[N]; struct GJ{ int s[N],L; void Print() { for(int i=L;i>1;--i) printf("%d",s[i]); printf("%d\n",s[1]); } }blank,A,B,Ans; GJ operator *(GJ X,GJ Y) { GJ mid=blank; mid.L=X.L+Y.L; for(int i=1;i<=X.L;++i) for(int j=1;j<=Y.L;++j) { mid.s[i+j-1]+=X.s[i]*Y.s[j]; mid.s[i+j]+=mid.s[i+j-1]/10; mid.s[i+j-1]%=10; } while(!mid.s[mid.L]&&mid.L>1)mid.L--; return mid; } int main() { cin>>S;A.L=strlen(S); for(int i=0;i<A.L;++i) A.s[A.L-i]=S[i]-'0'; cin>>S;B.L=strlen(S); for(int i=0;i<B.L;++i) B.s[B.L-i]=S[i]-'0'; Ans=A*B; Ans.Print(); return 0; }
被除數\(a[\ ]\) ,除數\(B\),答案 \(ans[]\)code
lst now=0; for(int i=1;i<=len;++i) { now=now*10+a[i]; ans[++cnt]=now/B; now=now%B; }bool flag=0; for(int i=1;i<=cnt;++i) { if(ans[i])flag=1; if(flag)printf("%d",ans[i]); }puts("");
不停地作高精減就能夠了
這個代碼是的\(Quai\) ,別介意ci
int compare(int aa[],int bb[]) { if(aa[0]>bb[0])return 1; if(aa[0]<bb[0])return -1; for(int i=aa[0];i>0;i--) { if(aa[i]>bb[i])return 1; if(aa[i]<bb[i])return -1; } return 0; } void numcpy(int aa[],int bb[],int l) { for(int i=1;i<=aa[0];i++)bb[i+l-1]=aa[i]; bb[0]=aa[0]+l-1; } int main() { cin>>a1>>b1;a[0]=a1.size(); b[0]=b1.size(),c[0]=a[0]-b[0]+1; for(int i=1;i<=a[0];i++)a[i]=a1[a[0]-i]-'0'; for(int i=1;i<=b[0];i++)b[i]=b1[b[0]-i]-'0'; for(int i=c[0];i>0;i--) { memset(t,0,sizeof(t)); numcpy(b,t,i); while(compare(a,t)>=0) { c[i]++; if(!compare(a,t)){a[0]=0;continue;} for(int i=1;i<=a[0];i++) { if(a[i]<t[i]) a[i+1]--,a[i]+=10; a[i]-=t[i]; } while(a[0]>0&&!a[a[0]])a[0]--; } } while(c[0]>0&&!c[c[0]])c[0]--; if(!c[0])puts("0"); else for(int i=c[0];i>0;i--)cout<<c[i]; return 0; }
你把讀入優化的板子改一下,一邊讀一邊就好了。get
int Read(lst n) { lst x=0;char ch=getchar(); while(!(ch>='0'&&ch<='9'))ch=getchar();//還不要判負數。。。 while( (ch>='0'&&ch<='9'))x=(x*10+ch-'0')%n,ch=getchar(); return x?x:n; } int main() { scanf("%lld",&n); cout<<Read(n)<<endl; }
其實這些均可以放進一個程序operator
我就懶得再弄了
高精仍是很簡單的,就是寫得煩
現在不少題目都採用取模的方法避免高精,因此掌握就好了string