我遇到了这段代码的麻烦......我需要创建一个算法,让用户输入一个数字(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:用葡萄牙语的变量编写代码,所以不要介意看起来很奇怪的变量。 *
答案 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;