回 帖 发 新 帖 刷新版面

主题:整数分解(givensum)

【问题描述】
一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
【输入格式】
输入文件givensum.in包含一个正整数N(1<N<1010)。
【输出格式】
输出文件givensum.out第一行为整数k,表示解的组数,剩余k行每行两个数字,分别表示组成N的连续数字和的第一个正整数和最后一个正整数,而且k组解是按照各组解第一个正整数从小到大排列的;如果无解,则输出给定的正整数N。
【输入样例】
10000
【输出样例】
4
18 142
297 1328
388 412
1998 2002

回复列表 (共3个回复)

沙发

提示:
除以奇数A,如果整除,且商为B,则输出B-A/2和B+A/2
除以偶数A,如果余1,且商为B,则输出B-A/2+1和B+A/2
除数从待求数K的1/2开始到2结束递减:)

板凳

[quote]提示:
除以奇数A,如果整除,且商为B,则输出B-A/2和B+A/2
除以偶数A,如果余1,且商为B,则输出B-A/2+1和B+A/2
除数从待求数K的1/2开始到2结束递减:)[/quote]
看不懂

3 楼

穷举!
var a:array[1..2,1..100] of longint;
    i,k,n,s,t:longint;
begin
  assign(input,'c:\givensum.in');
  reset(input);
  assign(output,'c:\givesum.out');
  rewrite(output);
  readln(n);
  s:=0;
  for i:=1 to n div 2 +1 do
  begin
    t:=i;
    k:=i;
    while k<n do
    begin
      t:=t+1;
      k:=k+t;
    end;
    if k=n then
    begin
      s:=s+1;
      a[1,s]:=i;
      a[2,s]:=t;
    end;
  end;
  if s=0 then writeln(n)
  else
  begin
    writeln(s);
    for i:=1 to s do writeln(a[1,i],' ',a[2,i]);
  end;
  close(input);
  close(output);
end.
[em2][em2][em2]

我来回复

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