高精度运算大全
一:基础篇
1:高精度加法:二个数位数相等:Pku2602 Superlong sums
var
n,i,j,k,l:longint;a,b,ans:array[1..1000000] of byte;
begin
readln(n); {N代表数字的位数}
for i:=1 to n do
readln(a[n-i+1],b[n-i+1]);
k:=0;
idesignfor i:=1 to n do
begin
ans[i]:=(a[i]+b[i]+k) mod 10; k:=(a[i]+b[i]+k) div 10;
end;
if k>0 then write(k);
for i:=n downto 1 do
write(ans[i]);
end.
2:高精度加法:二个数位数不相同:Zju1828 Fibonacci Numbers
var x,y,z:array[0..1000] of word;
i,j,k:word;
begin
while not eof(input) do
begin
readln(j);
x[1]:=1;x[0]:=1; {x[0]代表X数组所代表的数共有多少位}
y[1]:=1;y[0]:=1; {y[0]代表Y数组所代表的数共有多少位}
for i:=3 to j do
begin
fillchar(z,sizeof(z),0);
for k:=1 to y[0] do
begin
z[k+1]:=(z[k]+y[k]+x[k])div 10;
z[k]:=(z[k]+y[k]+x[k])mod 10;
end;
z[0]:=y[0]+ord(z[y[0]+1]<>0);
x:=y; {以下这二句话都是数组对数组赋值}
y:=z;
end;
for i:=z[0] downto 1 do
write(z[i]);
writeln;
end;
end.
新东方六级高频词汇
{这种题,还可以看一下PKU2506 Tiling}
3:高精度乘法:多位乘单位 :Pku1906 Three Power
猫猫是丛林里很多动物心中的天使,她为此十分自豪。猫猫最爱吃鱼了,她每天都要去池塘钓鱼吃。猫猫经常吃鱼脑,数学特别强,然而,小女生的性格决定了她的贪玩。
一天,猫猫钓到了很多条鱼。她并不想马上就把可怜的鱼儿吃掉,而是先折磨够之后再吃(有句话叫什么来着~最毒不过猫猫心)。
猫猫将这很多很多(数不过来)条鱼按照外观的漂亮程度排序,每个鱼的编号依次为1、2、3……N,第i条鱼的美观程度为3^(i-1)。
猫猫要把这些鱼放到桶里去。她每次拿的鱼的数目是任意的。中的鱼的“总美观程度”为各条鱼美观程度之和。例如:猫猫这一次拿了第一条鱼和第三条鱼,那么美观程度为1+9=10。
猫猫想知道,她可以获得的第k大的“总美观程度”是多少。
从文件中读入k,输出猫猫能够获得的,第k魔术的英文大的“总美观程度”。
输入数据:
数据包含n+1行,第一行读入n(n≤100)。以下n行每行包含一个k。
输出数据:
输出包含n行,每行输出一个对应的结果。
输入样例:
1
7
输出样例:
13
样例说明:
猫猫能够拿到的美观程度从小到大为1、3、4、9、10、12、13……所以第7大的美观程度是13。
对于50%的输入文件,有k≤5000。
对于100%的输入文件,有k≤2^31-1。
var
n:int64;w,i,j:longint;a:array[0..100]of longint;
begin
repeat
readln(n); if n=0 then break; n:=n-1;
write('{'); w:=0;
a[0]:=1; a[1]:=1;
while n>0 do
begin
if n mod 2=1 then {如果N为奇数,说明相应位置上的2013年国家线3的若干次方被使用到的}
begin
inc(w);if w>1 then write(','); write(' ');
for i:=a[0] downto 1 do
write(a[i]);
end;
n:=n div 2;
j:=0;
for i:=1 to a[0] do
config是什么意思
begin
a[i]:=a[i]*3+j;
j:=a[i] div 10;
a[i]:=a[i] mod 10;
end;
if j>0 {如果J不为零,说明还有进位,必须保存下来}
begin
inc(a[0]);
a[a[0]]:=j;
end;
end;
writeln(' }');
until fal;
end.
{这种题,还可以参考zju1073Round and Round We Go}
1073:Round and Round We Go
Time limit: 1 Seconds Memory limit: 32768K Total Submit: 2442 Accepted Submit: 1041
Problem
我门按如下的条件来定义一个“循环”数:
这个数的位数记为n(如142857,n=6,特别的,01,n=2),我门将这个数依次乘以,得到的n个数如果可以和原来的数循环对应起来(就是说每一位的数字排列的次序不变,但启始数字的位置可以变),那么这个数就称为“循环”的。
例如,142857是循环的:
142857*1=142857
142857*2=285714
142857*3=428571
142857*4=571428
142857*5=714285
142857*6=857142
特别注意的就是01是算两位数,1是算一位数
Output:
对于每个输入的数字,确定它是否是“循环”的
Example
Input
142857
142856
142858
01
0588235294117647
Output
142857 is cyclic
142856 is not cyclic
142858 is not cyclic
01 is not cyclic
0588235294117647 is cyclic
法国馆
4:高精度乘法:多位乘多位:Pku2389 Bull Math
const
mn=1000;
var问世是什么意思
x,y,z :]of longint;
Q :string;
i,j,p :longint;
begin
readln(Q);
for i:=1 to length(Q) do
x[i]:=ord(q[length(q)-i+1])-48;
x[0]:=length(Q);
readln(q);
for i:=1 to length(Q) do
y[i]:=ord(q[length(q)-i+1])-48;
y[0]:=length(q);
fillchar(z,sizeof(z),0);
for i:=1 to x[0] do
for j:=1 to y[0] do
begin
p:=i+j-1;
z[p]:=z[p]+x[i]*y[j];
z[p+1]:=z[p+1]+z[p] div 10;
z[p]:=z[p] mod 10;
end;
z[0]:=x[0]+y[0]; {z[0]代表结果共有多少位}
while z[z[0]]=0 do {这个是用于去掉最高位的不必要的零}
dec(z[0]);
for i:=z[0] downto 1 do
write(Z[i]);
writeln;
end.
5:高精度除法:多位除单位:Zju1923固执的数
一个数字M不断将它自身的各位数字相乘,直至得到一个一位数N。
例如679 -> 378 -> 168 -> 48 -> 32 -> 6. 679经过5次运算
最终到6,如果M是个一位数,那么它将不进行这种运算.
你的问题就在于对于给定的某个数字N,找出最小的Mhot issue。
Sample Input
0
1
4
7
高考短文改错18
49
51
768
-1
Sample Output
10
11
14
17
29
77
There is no such number.
2688
const
mn =1000;
type
arr =]of longint;
var
q :ansistring; x,bak :arr;
ans :array[1..10]of longint; i,o,tot :longint;
procedure divi(var a:arr;k:longint;var j:longint);
var i:longint;
begin
j:=0;
for i:=a[0] downto 1 do
begin
a[i]:=a[i]+j*10;
j:=a[i] mod k;气缸的耗气量
a[i]:=a[i] div k;
end;
while (a[0]>1) and (a[a[0]]=0) do dec(a[0]);
end;
begin
repeat
readln(q);
if q='-1' then break;
if q='0' then writeln('10')
el if q='1' then writeln('11')
el begin
x[0]:=length(q);
for i:=1 to x[0] do x[i]:=ord(q[x[0]+1-i])-48;
tot:=0;
for i:=9 downto 2 do