Pascal - 0到X之间的奇数之和

时间:2018-04-17 11:48:58

标签: pascal

我遇到了这段代码的麻烦......我需要创建一个算法,让用户输入一个数字(X),然后程序计算下面所有奇数的总和( x)的

这是我迄今为止所尝试过的,但无法真正理解其背后的逻辑:

Program odd_numbers;
Var
  Num, Limite, Soma: integer;
Begin;
 Soma := 0;
 Writeln('Choose a limit:');
 Readln(Limite);    
        While (Limite / 2 > 0) do
            Begin;
                Soma := ((Num < Limite) mod 2 > 0);                                 
                Writeln('The sum of odd numbers from 0 to ', Limite, ' é ', Soma);
            End;

        if (Limite mod 2 = 0) then
            Begin;
                Soma := ((Num < Limite) mod 2 = 0);
                Writeln('The sum of odd numbers from 0 to ', Limite, ' é ', Soma);
            End;
End.

* PS:用葡萄牙语的变量编写代码,所以不要介意看起来很奇怪的变量。 *

4 个答案:

答案 0 :(得分:1)

我看到每个人都在愉快地循环,但这不是必需的。这是一个简单的算术序列,可以在没有循环的情况下计算总和。

请想一想以下内容:

1 + 3                  = 2 * (1 +  3) / 2 = 2 * 2 = 4   ; limits 3 and 4
1 + 3 + 5              = 3 * (1 +  5) / 2 = 3 * 3 = 9   ; limits 5 and 6
1 + 3 + 5 + 7          = 4 * (1 +  7) / 2 = 4 * 4 = 16  ; limits 7 and 8
1 + 3 + 5 + 7 + 9      = 5 * (1 +  9) / 2 = 5 * 5 = 25  ; limits 9 and 10
1 + 3 + 5 + 7 + 9 + 11 = 6 * (1 + 11) / 2 = 6 * 6 = 36  ; limits 11 and 12

但不仅如此,你会发现它实际上总是一个完美的方块:Sqr((n+1) div 2)

所以只需计算:

program odd_numbers;
var
  Num, Limite, Soma: Integer;
begin
  Write('Choose a limit: ');
  Readln(Limite);
  Num := (Limite + 1) div 2;
  Soma := Num * Num;
  Writeln('The sum of odd numbers from 0 to ', Limite, ' is ', Soma);
end.

看起来比其他人提议的更简单。

答案 1 :(得分:0)

循环While (Limite / 2 > 0) do ...使用实数算术而不是整数算术。我想你的意思是While (Limite div 2 > 0) do ...你应该在循环中更改Limite,否则你会因为退出条件永远无法到达而被卡住。

答案 2 :(得分:0)

在您要求用户输入数字Limite后,您需要保持不变,因为您需要在最终消息中输入。您还需要一个循环,您可以在其中查看从Limite到0的所有数字。

你开始使用while循环没问题,你只是缺少循环控制变量。这是一个变量,最终得到一个终止值,然后停止循环。例如,使用您已声明的Num变量。您可以使用相同的变量来调查用户输入和0之间的数字,因为它们是奇数值。

num := limite-1; // give num a start value based on user input (-1 because of "... numbers below (x)")
while num > 0 do // stop the loop when 0 is reached
begin
  // here you investigate if `num` is a odd number (e.g. using `mod` operator or
  // possibly your pascal has a built in `function Odd(value: integer): boolean;`)
  // and add it to `Soma` if it is
  num := num - 1;// decrement num at every iteration
end;

最后,您需要考虑对上述内容的更改,以处理来自用户的负面输入。

答案 3 :(得分:0)

要测试整数是否为奇数值,可以使用以下函数:

function IsOdd( value : Integer) : Boolean;
begin
  IsOdd := (value mod 2) <> 0;
end;

许多pascal编译器都有一个名为Odd()的内置函数,您可以使用它。

while循环可以很好地解决这个问题。如果你从零以上的最低奇数开始,即一个并继续向上这么长时间,我们不会超过极限值,我们有一个简单的开始:

function GetOddSumBelowX( X : Integer) : Integer;
var
  i,sum: Integer;
begin
  i := 1;  // Start with first odd number
  sum := 0;
  while (i < X) do begin // as long as i less than X, loop
    if IsOdd(i) then begin
      sum := sum + i; // add to sum
    end;
    i := i + 1;  // Increment i 
  end;
  GetOddSumBelowX := sum;
end;  

现在,这很简单。简化循环的下一步是将i变量增加2,而不是在所有奇数之间跳转:

function GetOddSumBelowX( X : Integer) : Integer;
var
  i,sum: Integer;
begin
  i := 1;  // Start with first odd number
  sum := 0;
  while (i < X) do begin // as long as i less than X, loop
    sum := sum + i; // add to sum
    i := i + 2;  // Increment to next odd number
  end;
  GetOddSumBelowX := sum;
end;