作业帮 > 综合 > 作业

求N!左边第二位的数字pascal!不要C++!

来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/09/23 07:23:53
求N!左边第二位的数字pascal!不要C++!
求N!左边第二位的数字
Description
求N!左边第二位的数字k
Input
只有一行且只有一个正整数:N
( 4
求N!左边第二位的数字pascal!不要C++!
算完阶乘后,转为字符串就好处理了.
program Project2(input,output);
var
N:Integer;
S:string;
function jc(i:longint):longint;
var j:Integer;
begin
Result:=1;
for j:=1 to i do
result:=result*j;
end;
begin
read(N);
Str(jc(N),S);
Writeln(N,'!=',S);
Writeln('第二个数字是:', s[2]);
end.
再问: 算阶乘n=1000000时会超类型(包括qword、int64)!
再答: 100万的阶乘的话,应该没有什么类型能存储吧,也无法保证精度。既然只是要我们求出第2位的数,我的想法是每次相乘的时候,都除以一个10的N次幂的数,只要保证整数部分有两位就可以了,后面的精度就不要了。比如15!=1307674368000。可以只保存为13.07674368,再乘以16的时候,再除以10,一直保持两位整数就够了。因为我们只求左边第二位的数字。
再问: 本人没看懂,程序? 可以通过的话奖50分!
再答: 这是我在DELPHI7上写的代码,你参考一下,没装PASCAL的编译器 主要是我写了注释的那里,只保持前面的精度就可以了, 这样算的话,就算是你要算一千万的也能算。 program Project1; {$APPTYPE CONSOLE} uses SysUtils; var N:Integer; S:string; function jc(i:longint):double; var j:Integer; begin Result:=1; for j:=1 to i do begin result:=result*j; {当数大于100W的时候,除以1W,只保持前面的精度} while Result>1000000 do result:=Result/10000; end; end; begin read(N); S:=inttostr(trunc(jc(N))); Writeln('第二个数字是:', s[2]); readln end.