Pascal-0和X之间奇数的和

Pascal-0和X之间奇数的和,pascal,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

我在使用此代码时遇到了一些问题。。。我需要创建一个算法,让用户输入一个数字(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.
编程奇数;
变量
Num,Limite,Soma:整数;
开始;
胞体:=0;
Writeln('选择一个限制:');
Readln(Limite);
而(Limite/2>0)do
开始;
躯体:=((Num0);
Writeln('从0到',Limite,'é',Soma的奇数之和);
结束;
如果(限模2=0),则
开始;
躯体:=((Num

*PS:我一直在用葡萄牙语编写变量代码,所以不要介意这些变量看起来很奇怪*

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

在你要求用户输入一个数字后,
Limite
,你需要保持不变,因为你需要在最后的消息中使用它。您还需要一个循环,从
Limite
到0遍历所有数字

您从一个
开始,而
循环没有问题,只是缺少了循环控制变量。这是一个变量,它最终得到一个终止值,然后停止循环。例如,使用您已经声明的
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;

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

< P>测试一个整数是否为奇数,您可以使用以下函数:

function IsOdd( value : Integer) : Boolean;
begin
  IsOdd := (value mod 2) <> 0;
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;  
函数GetOddSumBelowX(X:Integer):整数; 变量 i、 和:整数; 开始 i:=1;//从第一个奇数开始 总和:=0; 当(i
我看到每个人都在愉快地循环,但这不是必须的。这是一个简单的算术序列,无需循环即可计算总和

只要想想以下几点:

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)div2)

所以只要计算一下:

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.

看起来比其他人的建议要简单一点。

具体来说,你的问题是什么?您的代码是否没有按预期工作?编译时出错,还是运行时出错?如果出现错误,错误消息是什么?在任何人都能提供有用的帮助之前,你需要提供更多的信息。如果你一步一步地去做会发生什么?你知道你可以不经过循环就计算出这个数字,对吗?看一看。更容易,更快。实际上,您不应该在这里使用循环。就像鲁迪建议的那样,简单地应用算术和的公式,“用葡萄牙语编写变量代码”。在把Q发到SO之前把它们翻译成英语是很有礼貌的。祝贺你和+1,我在一次去杂货店的旅行中也想到了同样的事情,同时你已经把它发了。不过有一个小细节:任务是(X)以下所有奇数的总和,小于X。简单的解决方法是从公式中删除
+1
。这也将使它适用于负值。是的,我读了下面的内容,但我不确定这是什么意思。通常,如果人们在下面说,他们的意思是“最多”和“包括”。尤其是
“从0到”,Limite,'e',Soma的奇数之和”这一部分让我觉得后者的意思是(0到一个包含Limite)。
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.