阶乘和
来源:互联网 发布:java 多线程同步机制 编辑:程序博客网 时间:2024/04/28 15:01
【问题描述】
已知正整数N(N<=100),设S=1!+2!+3!+...N!。其中"!"表示阶乘,即N!=1*2*3*……*(N-1)*N,如:3!=1*2*3=6。请编程实现:输入正整数N,输出计算结果S的值。
【输入样例】sum.in
4
【输出样例】sum.out
33
分析:此题是一个基础的高精度的运算,但是如果只是简单的用十进制运算的话,当n值过大超过33时结果就会出现异常,出现异常的原因是在做乘法过程中中间变量的值x会超过整数类型范围,所以如果n<100的话应该用100进制,如果求n的阶乘的话应该使用n进制。
pascal代码:
type
sz=array[0..500] of longint;
var
n,la,lb,len,i:integer;
a,b,total:sz;
procedure init;
begin
readln(n);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(total,sizeof(total),0);
a[1]:=1;
la:=1;
len:=1;
end;
procedure multi(var a:sz;n:integer);
var
i,x:longint;
begin
x:=0;
for i:=1 to la do
begin
x:=x+a[i]*n;
a[i]:=x mod 100;
x:=x div 100;
{writeln(x);}
end;
if x>0 then
begin
inc(la);
a[la]:=x;
end;
while (a[la]=0) and (la>1) do dec(la);
end;
procedure plus(var total:sz;a:sz);
var
i,x:longint;
begin
x:=0;
i:=1;
while (i<=la) or (i<=len) do
begin
x:=x+total[i]+a[i];
total[i]:=x mod 100;
x:=x div 100;
inc(i);
end;
len:=i;
total[len]:=x;
while (total[len]=0) and (len>1) do dec(len);
end;
begin
assign(input,'sum.in');
assign(output,'sum.out');
reset(input);
rewrite(output);
init;
for i:=1 to n do
begin
multi(a,i);
plus(total,a);
end;
write(total[len]);
for i:=len-1 downto 1 do write(total[i] div 10,total[i] mod 10);
close(input);
close(output);
end.
已知正整数N(N<=100),设S=1!+2!+3!+...N!。其中"!"表示阶乘,即N!=1*2*3*……*(N-1)*N,如:3!=1*2*3=6。请编程实现:输入正整数N,输出计算结果S的值。
【输入样例】sum.in
4
【输出样例】sum.out
33
分析:此题是一个基础的高精度的运算,但是如果只是简单的用十进制运算的话,当n值过大超过33时结果就会出现异常,出现异常的原因是在做乘法过程中中间变量的值x会超过整数类型范围,所以如果n<100的话应该用100进制,如果求n的阶乘的话应该使用n进制。
pascal代码:
type
sz=array[0..500] of longint;
var
n,la,lb,len,i:integer;
a,b,total:sz;
procedure init;
begin
readln(n);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(total,sizeof(total),0);
a[1]:=1;
la:=1;
len:=1;
end;
procedure multi(var a:sz;n:integer);
var
i,x:longint;
begin
x:=0;
for i:=1 to la do
begin
x:=x+a[i]*n;
a[i]:=x mod 100;
x:=x div 100;
{writeln(x);}
end;
if x>0 then
begin
inc(la);
a[la]:=x;
end;
while (a[la]=0) and (la>1) do dec(la);
end;
procedure plus(var total:sz;a:sz);
var
i,x:longint;
begin
x:=0;
i:=1;
while (i<=la) or (i<=len) do
begin
x:=x+total[i]+a[i];
total[i]:=x mod 100;
x:=x div 100;
inc(i);
end;
len:=i;
total[len]:=x;
while (total[len]=0) and (len>1) do dec(len);
end;
begin
assign(input,'sum.in');
assign(output,'sum.out');
reset(input);
rewrite(output);
init;
for i:=1 to n do
begin
multi(a,i);
plus(total,a);
end;
write(total[len]);
for i:=len-1 downto 1 do write(total[i] div 10,total[i] mod 10);
close(input);
close(output);
end.
- 阶乘和阶乘求和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和
- 阶乘和阶乘逆元
- 递归求阶乘和循环阶乘
- 高精度乘法和阶乘
- 阶乘累加和 汇编
- C++ 16(阶乘和)
- 因子和阶乘
- 因子和阶乘
- Android平台上使用属性系统(property system)
- 2012新年祝辞——变与不变
- 三星i9103入手体验
- Unity3d无证书发布流程
- .exe控制台程序使用自己的图标
- 阶乘和
- 对跳出多层循环的方法总结
- PECompact 2.5脱壳
- [Apache]常用知识
- tomcat5架构
- android 监听位置变化
- windows7下安装mingw
- Android Camera 架构简析
- js截取字符串