就当是复习了。
至于高精度除以高精度和高精度取模高精度,csp不会那么变态吧。。
struct bg{ int w[1005]; }; //存的时候倒着存,输的时候倒着输 for(int i=1;i<=len1;i++)a.w[i]=s1[len1-i]-'0'; for(int i=c.w[0];i>=1;i--)printf("%d",c.w[i]); bg jia(bg a,bg b) { bg c; if(a.w[0]>b.w[0])c.w[0]=a.w[0]+1; else c.w[0]=b.w[0]+1; for(int i=1;i<=c.w[0];++i)c.w[i]=0; for(int i=1;i<=c.w[0]-1;++i) { c.w[i]=(a.w[i]+b.w[i])%10; c.w[i+1]+=(a.w[i]+b.w[i])/10; } while(c.w[0]>1&&c.w[c.w[0]]==0)c.w[0]--; return c; } bg jian(bg a,bg b) { bg c; c.w[0]=a.w[0]; for(int i=1;i<=c.w[0];++i)c.w[i]=0; for(int i=1;i<=c.w[0];++i) { if(b.w[i]>a.w[i]) { a.w[i+1]--; a.w[i]+=10; } c.w[i]=a.w[i]-b.w[i]; } while(c.w[0]>1&&c.w[c.w[0]]==0)c.w[0]--; return c; } //高精乘低精 bg mul(bg a,int b) { for(int i=1;i<=a.w[0];++i) a.w[i]*=k; for(int i=1;i<=a.w[0];++i) { a.w[i+1]+=a.w[i]/10; a.w[i]%=10; } int j=a.w[0]; while(a.w[j]>9) { a.w[j+1]+=a.w[j]/10; a.w[j]%=10; } a.w[0]=j; while(a.w[a.w[0]+1]!=0)a.w[0]++; return a; } //高精乘高精 bg mull(bg a,bg b) { bg c; c.w[0]=a.w[0]+b.w[0]; for(int i=1;i<=c.w[0];++i)c.w[i]=0; for(int i=1;i<=a.w[0];++i) for(int j=1;j<=b.w[0];++j) { c.w[i+j-1]=a.w[i]*b.w[j]%10; c.w[i+j]+=(a.w[i]*b.w[j])/10; } while(c.w[c.w[0]+1]!=0)c.w[0]++; while(c.w[0]>1&&c.w[c.w[0]]==0)c.w[0]--; return c; } //高精乘除低精 bg chu(bg a,int b) { bg c; int x=0; c.w[0]=a.w[0]; for(int i=a.w[0];i>=1;--i) { c.w[i]=a.w[i]/b; a.w[i-1]+=(a.w[i]%b)*10; } while(c.w[0]>1&&c.w[c.w[0]]==0)c.w[0]--; return c; } //高精取模单精 int mod(string a,int b)//高精度a除以单精度b { int d=0; for(int i=1;i<=a.w[0];++i)d=(d*10+a.w[i])%b; return d; } //strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。 if(a.w[0]>b.w[0]||a.w[0]==b.w[0]&&strcmp(s1,s2)==1)c=jian(a,b); else if(a.w[0]<b.w[0]||a.w[0]==b.w[0]&&strcmp(s1,s2)==-1){c=jian(b,a);printf("-");} else printf("0");