Pascal-0和X之间奇数的和
我在使用此代码时遇到了一些问题。。。我需要创建一个算法,让用户输入一个数字(X),然后程序计算(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
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.