高精度运算
英文学校
第二讲高精度运算(加法)
一、高精度加法运算
wanglijun学习中级本书上的P180页到183页
举例:
回文数
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:trax
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10或N=16)进制数M,求最少经过几步可以得到回文数。
分别英语如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
样例:
INPUT OUTPUT
N = 9 M= 87 STEP=6
[算法设计] 本问题的核心是高精度加法,具体处理起来可以分为三个部分。
第一,是对读入数据的处理。本题中,数据的进制是可变的,所以用整型数(即十进制数)不是很方便,考虑一般情况,我们可以采用字符串读入,再对数据作后期加工,把它的每一位都分离开来,存入一个数组digit里,数组invert存放数组digit的倒序,变量len记录
了数据的位数。在转化过程中要注意到16进制的特殊性,要对于字母A B C D E F要单独处理。有理数的混合运算练习题
第二,进行判断与运算。存储数据时用什么形式表示其实无所谓,关键是做加法运算的时候要符合n进制的规律。所以,运算时一律以10进制形式存储,存储该位数码对应的十进制数值,A用10,F用15表示。判断是否构成回文数时也一样用10进制,逐对比较对称的两个数位上的数字,看它们是否相等。做加法的次数以30次为限。
第三,输出结果。如果当前的数是回文数,则输出步数;否则按“Impossible”输出。[程序清单]
program ex6_5(input,output)
const max=1000;
type arraytype=array [1..max] of longint;
var i,n,len,step:longint;
str:string;
digit,invert:arraytype;
function palindrome(var digit:arraytype;len:longint):boolean;
var i,j:longint;
begin
i:=1; j:=len;
while (i<="" p="">
begin i:=i+1; j:=j-1 end;
if i
end;
begin
write('Input n:'); readln(n);
write('Input number:'); readln(str);
for i:=1 to max do digit[i]:=0;
len:=length(str);
for i:=1 to len do
if str[i]>='A'
英语作文发言稿then digit[len+1-i]:=ord(str[i])-ord('A')+10
el digit[len+1-i]:=ord(str[i])-ord('0');
step:=0;
while (step<30) and not(palindrome(digit,len)) do
begin
for i:=1 to len do invert[i]:=digit[len+1-i];
agreeablefor i:=1 to len do digit[i]:=digit[i]+invert[i];
for i:=1 to len do
if digit[i]>=n then
begin digit[i+1]:=digit[i+1]+1;
digit[i]:=digit[i]-n end;
if digit[len+1]>0 then len:=len+1;
step:=step+1
end;
if step=30
then writeln('Impossible!')
el writeln('STEP=',step)
end.
二、高精度减法运算(中级书183~186页)
自学
三、高精度乘法运算
学习中级本书上的P186页到189页
举例:
用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5*4*3*2*1,输入正整数N,输出计算结果S。
[算法设计] 本题涉及高精度加法和乘法运算,程序使用二个一维数组s和f分别存储到当前项为止的和与当前项的值,计算当前项的值采用递推的迭代的方法,即k!=(k-1)*k。
[程序清单]
program ex6_6(input,output);pcmcia
const maxlen=100;
type arraytype=array [0..maxlen] of longint;
var i,n:integer;
f,s:arraytype;
procedure mul(var a:arraytype; k:longint); var i:longint;
begin
for i:=0 to maxlen do f[i]:=f[i]*k;
for i:=0 to maxlen-1 do
begin
a[i+1]:=a[i+1]+a[i] div 10;
a[i]:=a[i] mod 10feliz navidad
end
end;
procedure add(var a:arraytype;b:arraytype); var i:longint;
begin
for i:=0 to maxlen do a[i]:=a[i]+b[i]; for i:=0 to maxlen-1 do
if a[i]>=10 then
医院会计制度
begin
a[i+1]:=a[i+1]+1;
a[i]:=a[i]-10
end
end;
procedure print(a:arraytype);
var i,j:longint;
begin
i:=maxlen;