问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Pascal 高精度加法

发布网友 发布时间:2022-05-15 19:13

我来回答

2个回答

热心网友 时间:2024-02-27 06:34

if c[i-1]<>-1 then write(a[i]);
低级错误啊
不过更正过来程序好像还有问题
下面是我对此程序更正后的结果:
Program gaojing;
Uses
crt;
Type
longlong=array[-100..101] of shortint;{如果要后退100位,则必然会读取到a[-x],造成错误}
Var
a,b,c:longlong;
m,n:integer;
Procere init(var a,b:longlong;var m,n:integer);
Var
i,j:integer;
s:char;
Begin
for i:=1 to 2 do
begin
j:=0;
writeln('Input ',chr(i+96));
repeat
j:=j+1;
s:=readkey;
if s in ['0'..'9'] then
begin
write(s);
if i=1 then
a[j]:=ord(s)-48 else
b[j]:=ord(s)-48;
end;
until (s=#13)or(not(s in ['0'..'9']));
writeln;
if i=1 then m:=j else n:=j;
end;
End;
Procere machine(var c:longlong; a,b:longlong; m,n:integer);
Var
i,l:integer;
Begin
if m>n then l:=m else l:=n;
for i:=l downto 1 do
begin
a[i]:=a[m-l+i]; {移动的算式错误}
b[i]:=b[n-l+i]; {移动的算式错误}
end;
for i:=l downto 1 do
begin
c[i]:=a[i]+b[i]+c[i];
if c[i]>=10 then{满十进位,不是超十进位}
begin
c[i-1]:=1;
c[i]:=c[i]-10;
end;
end;
for i:=l+1 to 100 do c[i]:=-1;
End;
Procere shuchu(c:longlong);
Var
i:integer;
Begin
if c[0]<>0 then write(c[0]); {首位可能为0,要单独考虑是否输出}
for i:=1 to 100 do {从c[1]开始输出}
if c[i]<>-1 then write(c[i]);{更正输出a[i]的低级错误}
End;
Begin
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
init(a,b,m,n);
m:=m-1;n:=n-1; {m,n在读入数据时多出一位,在这里修正}
machine(c,a,b,m,n);
shuchu(c);
End.

热心网友 时间:2024-02-27 06:34

高精度运算
在实际中,我们常常需要进行一些很大的数的运算。但是我们知道,计算机中整数的范围是有限的,这时候,我们就需要用到所谓的高精度运算。
通俗地讲,高精度运算就是用一个数组来表示整数,用模拟人解竖式的方法进行计算。

用一个整型数组表示一个数,其中数组的每一个元素表示数的一位。第一个元素表示个位,第二个元素表示十位,以此类推。另外还需要一个变量来存放这个数的长度,通常把这个长度存放在数组下标为0的元素中。
多余的元素要设成0。
高精度加法
从个位开始,依次相加。注意进位。
两个数相加,和的长度有可能大于其中任何一个数,因此要注意最后正确设置和的长度。
A[i]=a[i]+b[i],若a[i]>9

dec(a[i],10),
inc(a[I+1]);
17532+2349=19881

17532
+
2349
--------------

19881
program
gjdplus(input,output);
var
st:string;
x,y:array[0..101]of
integer;
i,j,l1,l2:integer;
begin
assign(input,'gjdplus.in');
reset(input);
readln(st);
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
l1:=length(st);
for
i:=l1
downto
1
do
x[l1-i]:=ord(st[i])-ord('0');
readln(st);
l2:=length(st);
for
j:=l2
downto
1
do
y[l2-j]:=ord(st[j])-ord('0');
close(input);
if
l1<l2
then
l1:=l2;
for
i:=0
to
l1
do
begin
x[i]:=x[i]+y[i];
if
x[i]>=10
then
begin
inc(x[i+1]);
dec(x[i],10);
end;
end;
while
x[l1]<>0
do
inc(l1);
assign(output,'gjdplus.out');
rewrite(output);
for
i:=l1-1
downto
0
do
write(x[i]);
close(output);
end.
高精度减法
从个位开始,依次相减。有借位时向上一位借位。
两个数相减,差的长度有可能小于其中任何一个数,因此要注意最后正确设置差的长度。
这里不考虑出现小数减大数的情况。
A[i]<b[i]

dec(a[I+1]),inc(a[i],10),a[i]:=a[i]-b[i]
program
gjdj(input,output);
var
st:string;
x,y:array[0..101]of
integer;
i,j,l1,l2:integer;
begin
assign(input,'gjdplus.in');
reset(input);
readln(st);
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
l1:=length(st);
for
i:=l1
downto
1
do
x[l1-i]:=ord(st[i])-ord('0');
readln(st);
l2:=length(st);
for
j:=l2
downto
1
do
y[l2-j]:=ord(st[j])-ord('0');
close(input);
for
i:=0
to
l1
do
begin
if
x[i]<y[i]
then
begin
dec(x[i+1]);
inc(x[i],10);
end;
x[i]:=x[i]-y[i];
end;
while
(x[l1]=0)and(l1>0)
do
dec(l1);
assign(output,'gjdplus.out');
rewrite(output);
for
i:=l1
downto
0
do
write(x[i]);
close(output);
end.
第29课
高精度乘法
乘法相对来说要麻烦一些,但其本质思想仍然是一样的。
注意:乘法在累加的时候,进位可能大于1。因此要采用不同的进位方法。
532*349=185668
532
*
349
--------------
4788
2128
1596
--------------
185668
program
gjdj(input,output);
var
st:string;
x,y,c:array[0..101]of
integer;
i,j,temp,l1,l2,l3,k:integer;
begin
assign(input,'gjdplus.in');
reset(input);
readln(st);
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
fillchar(c,sizeof(c),0);
l1:=length(st);
for
i:=l1
downto
1
do
x[l1-i+1]:=ord(st[i])-ord('0');
readln(st);
l2:=length(st);
for
j:=l2
downto
1
do
y[l2-j+1]:=ord(st[j])-ord('0');
close(input);
for
j:=1
to
l2
do
for
i:=1
to
l1
do
begin
inc(c[i+j-1],x[i]*y[j]);
inc(c[i+j],c[i+j-1]div
10);
c[i+j-1]:=c[i+j-1]
mod
10;
end;
k:=l1+l2+1;
while
(k>1)
and
(c[k]=0)do
dec(k);
assign(output,'gjdplus.out');
rewrite(output);
for
i:=k
downto
1
do
write(c[i]);
close(output);
end.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
14岁每天做多少蹲起和提踵不影响长高 每天晚上提踵来练弹跳会影响长高吗? 提踵和练肌肉会不会长不高? 提踵(抬脚跟)训练会影响长个吗 求高人指点 提踵 会不会影响身高的增长? 我现在15岁 提踵有利于长高吗 提踵影响长高吗 win10可不可以玩盗版的中2,帝战,拿战 沧州蓝海光伏设备有限公司怎么样? 为什麽女巫要骑扫帚不骑板凳。。。 用pascal编一程序,用高精度运算,求n的累加和(1+2+3+...+n)的和 高精度计算的高精度除法 用pascal编一程序,用高精度运算,求n的累加和(1+2+3+..... 高精度累加 白玉外表出现了许多黑点是什么原因 一部电影的名字!!! -电影“奇爱博士”好看吗? 请问谁有地道的纯英文的产品介绍和企业介绍?跪求网址介绍!(外贸方向的) 分离纯化基因组dna异丙醇里需要加糖原吗 求助:TNE缓冲液详细配方 TNE缓冲液怎么配制? 智能硬件用英语怎么说 智能手机应用带给人们极大的方便 翻译成英语 请大神帮忙把一句中文翻译成英语:例如,智能手机、智能手表、智能吸尘器等等。 amily phone,m是mobile phone。 我的征信黑了,怎么才能贷款呢? 网黑怎么可以贷款 网黑的客户要怎么贷款呢? 吃冬瓜皮可以减肥吗 冬瓜皮对身体有什么好处 唱歌的时候如何跟别人互动? 对于高精度小数的操作(C语言) 累加和极限什么关系 pascal用高精度方法求s=1+2+3+……+n的精确值 高精度乘法和除法 Pascal 高精度的问题 在vc++中 怎样实现超过精度超过1000位的大数相加减? Kahan&#39;s Summation Formula为什么能提高计算精度 mathematica中两个精度不同的数相加,得数自动为最小精度的解,如何得到高精度的解?比如精确的16位 怎样才能复制下来 2019安徽编导省统考209分高考文化课预估430分文科可以上二本吗? 什么是Buffer和Unbuffer的? 如何才能复制自己的? 安徽编导最近几年都有多少人考试?大概什么水平才能通过? 安徽统考大纲影片编导? 安徽编导考试难不难,需要不要去报班上课? 怎么复制 安徽省的编导统考都是考什么?各类分数是什么 有没有人知道哪里有采集和分析串口RS232数据包的工具啊? 安徽今年的编导考生,统考考了三千名,能上省内的大学吗? 2021安徽编导省统考过线估分多少?