切换到宽版
  • 4305阅读
  • 0回复

等差数列问题 [复制链接]

上一主题 下一主题
离线fjq514
 
只看楼主 倒序阅读 0 发表于: 2006-12-04
Arithmetic Progressions

等差数列

译 by tim green

一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)
在这个问题中a是一个非负的整数,b是正整数。
写一个程序来找出在双平方数集合S中长度为n的等差数列。
双平方数集合是所有能表示成p2+q2的数的集合。

PROGRAM NAME: ariprog

INPUT FORMAT
第一行:   N(3<= N<=25),要找的等差数列的长度。
第二行:   M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。

SAMPLE INPUT (file ariprog.in)
5
7

OUTPUT FORMAT
如果没有找到数列,输出`NONE'。
如果找到了,输出一行或多行, 每行由于二个整数组成:a,b
这些行应该先按b排序再按a排序。
将不会有只多于10,000个等差数列。

SAMPLE OUTPUT (file ariprog.out)
1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24



大家来看看我的程序 会不会有什么问题?

uses sysutils;
const max=1000000;
var f1,f2:text;pf:array[0..max] of boolean; i,j,k,a,b,m,n:longint;
q,p,l:longint; t0:tdatetime;
begin
t0:=now;
assign(f1,'E:\os\pp\bin\go32v2\dengcha.in');
assign(f2,'E:\os\pp\bin\go32v2\dengcha.out');
reset(f1);
rewrite(f2);
readln(f1,a);
readln(f1,b);
close(f1);

n:=b*b+b*b;
m:=(n div (a-1))+1;
for i:= 1 to n do pf:=false;
  for i:=0 to b do
  for j:=0 to b do begin k:=i*i+j*j; pf[k]:=true;end;
 
  for i:= 1 to m do begin
    k:=1;

    repeat
    l:=k;
    q:=0;p:=0;
    repeat
    if pf[l] then begin l:=l+i; p:=p+1;end
    else   q:=1;
    until ((q=1) or (p=a));
    if p=a then writeln(f2,k,' ',i);
    k:=k+1;
    until (n-k-m<3);
      end;


    writeln(f2,'Runtime is ',(now-t0)*86400:0:2,' seconds.');
    close(f2);
    end.
快速回复
限100 字节
 
上一个 下一个