实验八 大数问题

实验名称:实验八 大数问题

实验目的:熟练掌握大数的加减、乘法、除法和高精度计算。

实验内容:

  1. 问题描述:(大数加减)求两个不超过200位的非负整数的和。

输入:有两行,每行是一个不超过200位的非负整数,没有多余的前导0。

输出:一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

输入样例

88888888888888888888

33333333333333333333

输出样例

122222222222222222221

  1. 问题描述:(大数乘法)求两个不超过50位的非负整数的积。

输入:有两行,每行是一个不超过50位的非负整数,没有多余的前导0。

输出:一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

输入样例

12345678900

98765432100

输出样例

1219326311126352690000

  1. 问题描述:(大数除法)求2个大的正整数相除的商。

输入:第1行是测试数据的组数t,每组测试数据占2行,第1行是被除数,第2行是除数。每行数据不超过100个字符。

输出:t行,每组测试数据有一行输出是相应的整数商。

输入样例

3

2405337312963373359009260457742057439230496493930355595797660791082739646

2987192585318701752584429931160870372907079248971095012509790550883793197894

10000000000000000000000000000000000000000

10000000000

5409656775097850895687056798068970934546546546575676768678435435345

1

输出样例

0

1000000000000000000000000000000

5409656775097850895687056798068970934546546546575676768678435435345

  1. 问题描述:(高精度计算)计算国债对于计算机来说是一件很繁重的事情,该问题涉及到的精度很高。现需要你编写一个程序用来计算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);

}

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值