codevs 3115,3116,3117。
主要是对于高精度的练习,还不会的同学可以学习下。
//加法 #include<stdio.h> #include<string.h> struct hp { int w[260]; }; hp jia(hp a,hp b) { hp c; c.w[0]=a.w[0]>b.w[0]?a.w[0]+1: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]; c.w[i+1]+=c.w[i]/10; c.w[i]%=10; } while (c.w[0]>1&&c.w[c.w[0]]==0) c.w[0]--; return c; } hp a,b,c; char s[260]; int main() { int len; scanf("%s",s); len=strlen(s); a.w[0]=len; //把第一个数存为高精度 for (int i=1;i<=len;i++) a.w[i]=s[len-i]-'0'; scanf("%s",s); len=strlen(s); b.w[0]=len; //把第二个数存为高精度 for (int i=1;i<=len;i++) b.w[i]=s[len-i]-'0'; c=jia(a,b); for (int i=c.w[0];i>=1;i--) printf("%d",c.w[i]); printf("\n"); return 0; }
//乘法 #include<stdio.h> #include<string.h> struct hp { int w[260]; }; hp a,b,c; void cheng(hp a,hp b) { c.w[0]=a.w[0]+b.w[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]; c.w[i+j]+=c.w[i+j-1]/10; c.w[i+j-1]%=10; } while(c.w[0]>1&&c.w[c.w[0]]==0) c.w[0]--; } int main() { char s1[260],s2[260]; scanf("%s%s",s1,s2); a.w[0]=strlen(s1); for(int i=1;i<=a.w[0];i++) a.w[i]=s1[a.w[0]-i]-'0'; b.w[0]=strlen(s2); for(int i=1;i<=b.w[0];i++) b.w[i]=s2[b.w[0]-i]-'0'; cheng(a,b); for(int i=c.w[0];i>=1;i--) printf("%d",c.w[i]); return 0; }
高精度是基础,学会后还可以做一些其他的题目进行练习。