回 帖 发 新 帖 刷新版面

主题:tree Pascal 求解  4题

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个回复)

沙发

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.

板凳

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 楼

第四题看不懂..如果我理解正确的话应该无解吧..
其他题已有头绪.下午放学写. 现在要上课.

4 楼

很简单的第一题.. 不过解的时候大意,差点犯错了.. 汗!
先上第一题.
明显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 楼

再编了一个推广至 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 楼

网上有另一个方法.
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 楼

刚自己编了一个,才发现下面这个程序(在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 楼

我自己编的.. 如无意外应该没错.. 小菜我编得辛苦呀....

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 楼

其实我编了两个,有一个是用递归,不知道哪里出错了,结果很无奈..检查了半天还没搞出哪里出错..

一怒之下,毫不犹豫,果断地编了第二个..

10 楼

第1题,建议使用高精度乘法来试一试。

我来回复

您尚未登录,请登录后再回复。点此登录或注册