实验名称:实验八 大数问题
实验目的:熟练掌握大数的加减、乘法、除法和高精度计算。
实验内容:
- 问题描述:(大数加减)求两个不超过200位的非负整数的和。
输入:有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出:一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例
88888888888888888888
33333333333333333333
输出样例
122222222222222222221
- 问题描述:(大数乘法)求两个不超过50位的非负整数的积。
输入:有两行,每行是一个不超过50位的非负整数,没有多余的前导0。
输出:一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例
12345678900
98765432100
输出样例
1219326311126352690000
- 问题描述:(大数除法)求2个大的正整数相除的商。
输入:第1行是测试数据的组数t,每组测试数据占2行,第1行是被除数,第2行是除数。每行数据不超过100个字符。
输出:t行,每组测试数据有一行输出是相应的整数商。
输入样例
3
2405337312963373359009260457742057439230496493930355595797660791082739646
2987192585318701752584429931160870372907079248971095012509790550883793197894
10000000000000000000000000000000000000000
10000000000
5409656775097850895687056798068970934546546546575676768678435435345
1
输出样例
0
1000000000000000000000000000000
5409656775097850895687056798068970934546546546575676768678435435345
- 问题描述:(高精度计算)计算国债对于计算机来说是一件很繁重的事情,该问题涉及到的精度很高。现需要你编写一个程序用来计算Rn,这里R是一个实数(0.0<R<99.999),而n是一个整数(n≤30)。
输入:第1行是测试数据的组数t,每组测试数据占1行,每行包括一对数R和n。
输出:对应每组测试数据输出一行Rn的精确值。首尾无意义的零不要输出,如果是整数,不要输出小数点。
输入样例
2
95.123 12
98.999 10
输出样例
548815620517731830194541.899025433415715973535967221869852721
90429072743629540498.107596019456651774561044010001
实验结果与分析(运行界面截图,打开需要截的图,按ALT+PrintScreen后,将光标移到下面,单击右键后选择“粘贴”):
1.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char s[202]; int sum[201]; int i,j,d,len,maxlen=0; for(i=0;i<201;i++) sum[i]=0; for(i=0;i<2;i++) { scanf("%s",s); len=strlen(s); if(len>maxlen)maxlen=len; for(j=len-1;j>=0;j--) sum[len-1-j]+=s[j]-'0'; } for(i=0,d=0;i<maxlen;i++) { sum[i]+=d; d=sum[i]/10; sum[i]%=10; } if(d>0) sum[maxlen++]+=d; for(i=maxlen-1;i>=0;i--) s[maxlen-1-i]=sum[i]+'0'; s[maxlen]='\0'; printf("%s\n",s); } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
2.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char sa[51],sb[51],sc[101]; int a[50],b[50],c[100],i,j,k,d,alen,blen; scanf("%s",sa); scanf("%s",sb); for(i=0;i<50;i++) { a[i]=0; b[i]=0; } alen=strlen(sa); i=alen-1;k=0; while(i>=0) a[k++]=sa[i--]-'0'; blen=strlen(sb); i=blen-1;k=0; while(i>=0) b[k++]=sb[i--]-'0'; for(i=0;i<100;i++) c[i]=0; for(i=0;i<alen;i++) for(j=0;j<blen;j++) c[i+j]+=a[i]*b[j]; k=99; while(k>=0&&c[k]==0) k--; i=0;d=0; while(i<=k) { c[i]+=d; d=c[i]/10; c[i]%=10; i++; } while(d>0) { c[i]=d%10; d/=10; i++; } k=i; for(i=k-1;i>=0;i--) sc[k-1-i]=c[i]+'0'; sc[k]='\0'; printf("%s\n",sc); } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
3.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> #define N 100 int subtract(int *p1,int *p2,int len1,int len2) { int i,flarger; if(len1<len2) return(-1); flarger=1; if(len1==len2) { for(i=len1-1;i>=0;i--) { if(p1[i]>p2[i])break; if(p1[i]<p2[i])return (-1); } } for(i=0;i<len1;i++) { p1[i]-=p2[i]; if(p1[i]<0) { p1[i]+=10; p1[i+1]--; } } for(i=len1-1;i>=0;i--) if(p1[i])return(i+1); return (0); } int main(int argc, char *argv[]) { char sa[N+1],sb[N+1],sc[N+1]; int t,i,k,d,alen,blen,ntime; int a[N],b[N],c[N]; scanf("%d",&t); while(t-->0) { scanf("%s",sa); scanf("%s",sb); for(i=0;i<N;i++) { a[i]=0;b[i]=0;c[i]=0;//init } alen=strlen(sa); i=alen-1;k=0; while(i>=0) a[k++]=sa[i--]-'0'; blen=strlen(sb); i=blen-1;k=0; while(i>=0) b[k++]=sb[i--]-'0'; if(alen<blen) { printf("0\n"); continue; } ntime=alen-blen; for(i=alen-1;i>=0;i--) { if(i>=ntime) b[i]=b[i-ntime]; else b[i]=0; } blen=alen; for(i=0;i<=ntime;i++) { while((k=subtract(a,b+i,alen,blen-i))>=0) { alen=k; c[ntime-i]++; } } k=N-1; while(k>0&&c[k]==0)k--; i=0;d=0; while(i<=k) { c[i]+=d; d=c[i]/10; c[i]%=10; i++; } while(d>0) { c[i]=d%10; d=d/10; i++; } k=i; for(i=k-1;i>=0;i--) sc[k-1-i]=c[i]+'0'; sc[k]='\0'; printf("%s\n",sc); } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
4.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> #define N 150 void mult(int *p1,int *p2,int len1,int *len2) { int i,j,k,d,ts[N]; for(i=0;i<N;i++) ts[i]=0; for(i=0;i<len1;i++) for(j=0;j<*len2;j++) ts[i+j]+=p1[i]*p2[j]; k=len1+(*len2); for(i=0,d=0;i<k;i++) { p2[i]=(ts[i]+d)%10; d=(ts[i]+d)/10; } if(d>0) { p2[i]=d; k++; } *len2=k; } int main(int argc, char *argv[]) { char sa[8],sb[N+1]; int t,i,j,k,alen,blen,n,pot; int a[8],b[N]; scanf("%d",&t); while(t-->0) { scanf("%s%d",sa,&n); alen=strlen(sa); k=alen-1; while(k>=0&&sa[k]!='.')k--; if(k<0)pot=0; else{ j=alen-1; while(j>0&&sa[j]=='0')j--; alen=j+1; sa[alen]='\0'; pot=alen-k-1; } i=alen-1;k=0; while(i>=0) { if(sa[i]!='.')a[k++]=sa[i]-'0'; i--; } for(i=0;i<N;i++) b[i]=0; alen=blen=k; for(i=0;i<alen;i++) b[i]=a[i]; for(i=1;i<n;i++) mult(a,b,alen,&blen); k=pot*n; n=blen>k?blen:k; for(j=0,i=n-1;i>=0;i--) { if(i==k-1)sb[j++]='.'; sb[j++]=b[i]+'0'; } sb[j]='\0'; printf("%s\n",sb); } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析