求助。。一道关于高精度乘法的程序题(pascal)
求n!的精确值输入只有一行n输出n!的精确值数据规模1<=n=>10^18各位拜托啦。。。话说,编程蛮辛苦的,我把悬赏改成30了。。。。...
求n!的精确值
输入
只有一行n
输出
n!的精确值
数据规模
1<=n=>10^18
各位拜托啦。。。
话说,编程蛮辛苦的,我把悬赏改成30了。。。。 展开
输入
只有一行n
输出
n!的精确值
数据规模
1<=n=>10^18
各位拜托啦。。。
话说,编程蛮辛苦的,我把悬赏改成30了。。。。 展开
6个回答
展开全部
program y1_1;
const
z=10000;
var
a:array[0..z+1]of integer;
n,j,i,k:longint;
begin
readln(n);
begin
a[1]:=1;
for i:=1 to n do
begin
for j:=1 to z do
a[j]:=a[j]*i;
for k:=1 to z do
begin
a[k+1]:=a[k+1]+a[k]div 10;
a[k]:=a[k]mod 10;
end;
end;
i:=z;k:=0;
repeat
if a[i]<>0 then k:=1;
i:=i-1;
until k=1;
k:=0;
for j:=i+1 downto 1 do
write(a[j]);
end;
writeln;
end.
const
z=10000;
var
a:array[0..z+1]of integer;
n,j,i,k:longint;
begin
readln(n);
begin
a[1]:=1;
for i:=1 to n do
begin
for j:=1 to z do
a[j]:=a[j]*i;
for k:=1 to z do
begin
a[k+1]:=a[k+1]+a[k]div 10;
a[k]:=a[k]mod 10;
end;
end;
i:=z;k:=0;
repeat
if a[i]<>0 then k:=1;
i:=i-1;
until k=1;
k:=0;
for j:=i+1 downto 1 do
write(a[j]);
end;
writeln;
end.
展开全部
没必要那么麻烦
我简要的敲一下
k:=1; a[k]:=1;
for i:=2 to n do
begin
x:=0;
for j:=1 to k do
begin
x:=x+a[j]*i;
a[j]:=x mod 10;
x:=x div 10;
while x> 0 then
begin k:=k+1; a[k]:=x mod 10;x:=x div 10;end;
end;
end;
如果觉得我的答案还可以就请采纳吧
版权归小佑0_0糖所有,盗用者④
我简要的敲一下
k:=1; a[k]:=1;
for i:=2 to n do
begin
x:=0;
for j:=1 to k do
begin
x:=x+a[j]*i;
a[j]:=x mod 10;
x:=x div 10;
while x> 0 then
begin k:=k+1; a[k]:=x mod 10;x:=x div 10;end;
end;
end;
如果觉得我的答案还可以就请采纳吧
版权归小佑0_0糖所有,盗用者④
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是高精度乘高精度:
const n=12800;
type t=array[1..n]of 0..9;
var a,b,c,d,e:t;
l1,l2,i,j,k,s,p:longint;
s1,s2:string;
f:text;
time,t1,t2:real;
procedure cheng(var a,b:t;l1,l2:longint);
var z:longint;
begin
for j:=1 to l2 do
begin
k:=0;
for i:=1 to l1 do
begin
z:=(a[i]*b[j]+k)mod 10;
k:=(a[i]*b[j]+k)div 10;
c[i+j-1]:=c[i+j-1]+z;
if c[i+j-1]>=10 then begin
k:=k+c[i+j-1] div 10;
c[i+j-1]:=c[i+j-1]mod 10;
end;
end;
c[l1+j]:=c[l1+j]+k;
end;
end;
下面是单精度乘以高精度:
var m:string;
n,i,k,j,b,c,d:integer;
a:array[1..500]of integer;
begin
readln(m);
readln(n);
for i:=length(m) downto 1 do
begin
b:=ord(m[i])-48;
a[i]:=(b*n+j) mod 10;
j:=(n*b+j) div 10;
c:=c+1;
end;
if j>0 then write(j);
for i:=1 to c do write(a[i]);
end.
我把主要的精度计算给你了,其他的么自己编了~~改改就好了
const n=12800;
type t=array[1..n]of 0..9;
var a,b,c,d,e:t;
l1,l2,i,j,k,s,p:longint;
s1,s2:string;
f:text;
time,t1,t2:real;
procedure cheng(var a,b:t;l1,l2:longint);
var z:longint;
begin
for j:=1 to l2 do
begin
k:=0;
for i:=1 to l1 do
begin
z:=(a[i]*b[j]+k)mod 10;
k:=(a[i]*b[j]+k)div 10;
c[i+j-1]:=c[i+j-1]+z;
if c[i+j-1]>=10 then begin
k:=k+c[i+j-1] div 10;
c[i+j-1]:=c[i+j-1]mod 10;
end;
end;
c[l1+j]:=c[l1+j]+k;
end;
end;
下面是单精度乘以高精度:
var m:string;
n,i,k,j,b,c,d:integer;
a:array[1..500]of integer;
begin
readln(m);
readln(n);
for i:=length(m) downto 1 do
begin
b:=ord(m[i])-48;
a[i]:=(b*n+j) mod 10;
j:=(n*b+j) div 10;
c:=c+1;
end;
if j>0 then write(j);
for i:=1 to c do write(a[i]);
end.
我把主要的精度计算给你了,其他的么自己编了~~改改就好了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
var n,w,i:longint;
a:packed array[1..100000]of longint;
procedure jc(k:longint);
var x,i:longint;
begin
x:=0;
for i:=1 to w do
begin
a[i]:=a[i]*k+x;
x:=a[i] div 10;
a[i]:=a[i] mod 10;
end;
while x>0 do
begin
w:=w+1;
a[w]:=x mod 10;
x:=x div 10;
end;
end;
begin
read(n);
a[1]:=1;
w:=1;
for i:=1 to n do jc(i);
for i:=w downto 1 do write(a[i]);
end.
如果用高精度的话,10^18的数据规模肯定会超时,需要优化。
a:packed array[1..100000]of longint;
procedure jc(k:longint);
var x,i:longint;
begin
x:=0;
for i:=1 to w do
begin
a[i]:=a[i]*k+x;
x:=a[i] div 10;
a[i]:=a[i] mod 10;
end;
while x>0 do
begin
w:=w+1;
a[w]:=x mod 10;
x:=x div 10;
end;
end;
begin
read(n);
a[1]:=1;
w:=1;
for i:=1 to n do jc(i);
for i:=w downto 1 do write(a[i]);
end.
如果用高精度的话,10^18的数据规模肯定会超时,需要优化。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ice_chain的难以在1s内出解
可以将1..n分解质因数,求出各质因数的个数,然后用二分快速幂
n的范围较大,要用int64
可以将1..n分解质因数,求出各质因数的个数,然后用二分快速幂
n的范围较大,要用int64
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询