主题:tree Pascal 求解 4题
w7x7t772007
[专家分:0] 发布于 2010-12-12 11:55:00
1求100!尾数有几个0 (n!=1*2*3*..*n)即阶乘
2将1-9九个数字填入下表 组成3位数 使前2个数的和等于后一个数:求出所有解 并统计解的个数
000+000=000 (注:0=数字)。
3连续若干个整数和为100 试写出所有连续整数解。答案不为一。
4 1-6六个数字 0
0 0
0 0 0
填入上表 使每行 和相等 数字不重复。 (输出形式: a b c d e f )
回复列表 (共11个回复)
沙发
幽灵密码 [专家分:3510] 发布于 2010-12-20 18:56:00
3.
uses crt;
var
i,j,s,k:integer;
begin
clrscr;
for i:=0 to 12 do
for j:=1 to 100-i do begin
s:=0;
for k:=j to j+i do inc(s,k);
if s=100 then begin
for k:=j to j+i-1 do write(k,'+');
writeln(j+i,'=100');
end;
end;
readln
end.
板凳
幽灵密码 [专家分:3510] 发布于 2010-12-20 19:04:00
3.
uses crt;
var
i,j,s,k,n,f:longint;
begin
clrscr;
readln(n);
repeat
i:=i+1;
inc(s,i);
until s>=100;
f:=i;
for i:=0 to f do
for j:=1 to n-i do begin
s:=0;
for k:=j to j+i do inc(s,k);
if s=n then begin
for k:=j to j+i-1 do write(k,'+');
writeln(j+i,'=',n);
end;
end;
writeln(f);
readln
end.
输入100
3 楼
Tennokare [专家分:80] 发布于 2011-02-21 14:32:00
第四题看不懂..如果我理解正确的话应该无解吧..
其他题已有头绪.下午放学写. 现在要上课.
4 楼
Tennokare [专家分:80] 发布于 2011-02-21 22:51:00
很简单的第一题.. 不过解的时候大意,差点犯错了.. 汗!
先上第一题.
明显100!已经超出了longint的范围.
观察可得.长串的阶乘中,只有含质因子5的数与偶数中的2(明显比因子5的个数多)相乘等于10,末位加一个零.
PROGRAM onl2;
VAR
count:integer;
BEGIN
count:=(100 DIV 5)+(100 DIV 25); {此外25中含2个质因子5,同理50,75,100}
writeln('100! end has ',count,' zero')
END.
5 楼
Tennokare [专家分:80] 发布于 2011-02-21 23:48:00
再编了一个推广至 n!的 ,当然n在longint的范围里的某一值内,难得去算这极限值,也没这水平.
如果n大于这个极限值.得出的答案就不会准确..或者直接报错了.
PROGRAM onl2;
VAR
n,count,i,fac:longint;
PROCEDURE next;
VAR
j,num:longint;
BEGIN
fac:=fac*5;
num:=n DIV fac;
IF num<>0
THEN BEGIN
count:=count+(n DIV fac);
next;
END
END;
BEGIN
writeln('please input n');
read(n);
fac:=1;
count:=0;
next;
writeln(n,'! end has ',count,' zero')
END.
6 楼
Tennokare [专家分:80] 发布于 2011-02-22 00:06:00
网上有另一个方法.
var n,i,s,k:longint;
begin
readln(n);
s:=0;
for i:=1 to n do begin
k:=i;
while k mod 5=0 do begin s:=s+1;k:=k div 5;end;
end;
writeln(s);
end.
(摘自某网易博客)
不过经过对两个算法的速度测试..n偏大的时候, 我的算法要快10e+7
第二题已有稿,明天再贴.. 唉,这里人气几乎为0
7 楼
Tennokare [专家分:80] 发布于 2011-02-22 21:20:00
刚自己编了一个,才发现下面这个程序(在delphi上编的吧)的结果不对.其中出现了一个带0的3位数.
要加个算法排除'0',
楼下贴上我自己的..
2..直接摘自soso问问
将1-9这9个数子分成三组(每个数字只能使用一次),分别组成三个三位数,且这三个三位数的值构成1:2:3的比例,试求出所有满足条件的三个三位数。
//判断互斥函数
function NotTheSame(a, b, c: Integer): Boolean;
var
sa, sb, sc: string;
function TNotSame(m, n: Integer): Boolean;
var
i, j: Integer;
begin
Result := True;
//a和b互斥
for i := 1 to Length(IntToStr(m)) do
for j := 1 to Length(IntToStr(n)) do
if IntToStr(m)[i] = IntToStr(n)[j] then
begin
Result := False;
Break;
end;
//自身互斥m
for i := 1 to Length(IntToStr(m)) - 1 do
for j := i + 1 to Length(IntToStr(n)) do
if IntToStr(m)[i] = IntToStr(m)[j] then
begin
Result := False;
Break;
end;
//自身互斥n
for i := 1 to Length(IntToStr(n)) - 1 do
for j := i + 1 to Length(IntToStr(n)) do
if IntToStr(n)[i] = IntToStr(n)[j] then
begin
Result := False;
Break;
end;
end;
begin
Result := True;
//转字符串
sa := IntToStr(a);
sb := IntToStr(b);
sc := IntToStr(c);
//a, b, c互斥
if (TNotSame(a, b) = False) or (TNotSame(a, c) = False) or (TNotSame(b, c) = False) then
Result := False;
end;
var
i: Integer;
begin
for i := 123 to 333 do
if NotTheSame(i, i *2, i * 3) then
Writeln(i, ' ', i * 2, ' ', i * 3);
Readln;
end.
8 楼
Tennokare [专家分:80] 发布于 2011-02-22 23:30:00
我自己编的.. 如无意外应该没错.. 小菜我编得辛苦呀....
PROGRAM onl3;
VAR
i,j,k,num:integer;
FUNCTION judge(i,j,k:integer):boolean;
VAR
c:integer;
x:ARRAY[1..9]OF boolean;
g,b,s:ARRAY[1..3]OF integer;
FUNCTION a(shu,m:integer):boolean;
BEGIN
a:=false;
g[m]:=shu MOD 10; {得出3位数的个,十,白上的数字,判断是否重复}
s[m]:=(shu DIV 10) MOD 10;
IF (g[m]<>0) AND (s[m]<>0) AND (g[m]<>s[m]) {需要判断是否带0}
THEN BEGIN
b[m]:=shu DIV 100;
IF b[m]<>0
THEN IF (b[m]<>g[m]) AND (b[m]<>s[m])
THEN a:=true
END
END;
BEGIN
fillchar(x,sizeof(x),1);
judge:=false;
IF i+j=k THEN
IF a(i,1) AND a(j,2) AND a(k,3)
THEN BEGIN
FOR c:=1 TO 3 DO
BEGIN
x[g[c]]:=false;x[b[c]]:=false;x[s[c]]:=false {判断9位数字是否有重复.}
END;
judge:=true;
FOR c:=1 TO 9 DO
IF x[c]=true THEN judge:=false;
END
END;
BEGIN
num:=0;
FOR i:=123 TO 386 DO {这里是 从大范围里面观察数字得出经缩小的范围}
FOR j:=386 TO 784 DO
FOR k:=549 TO 999 DO
IF judge(i,j,k)
THEN BEGIN
writeln(i,'+',j,'=',k);
inc(num)
END;
writeln(num);
END.
9 楼
Tennokare [专家分:80] 发布于 2011-02-22 23:36:00
其实我编了两个,有一个是用递归,不知道哪里出错了,结果很无奈..检查了半天还没搞出哪里出错..
一怒之下,毫不犹豫,果断地编了第二个..
10 楼
sdzcsyzx [专家分:0] 发布于 2011-03-14 14:47:00
第1题,建议使用高精度乘法来试一试。
我来回复