我想插入一个数字,程序告诉我这个数字是否是自然数的平方。到目前为止,它说 if(x div sqrt(x)= sqrt(x))
有问题program Naturalnumbers;
var
x : integer;
begin
writeln ( ' is the inserted number a square of a natural number? ' );
readln (x);
if (x div sqrt(x)=sqrt(x)) then
writeln( 'yes' )
else
writeln('no' )
readln;
end;
答案 0 :(得分:1)
您尝试x div sqrt(x)
x
为Integer
。
Sqrt
函数返回Extended
。这是一个浮点数。 div
运算符是Integer
个数字的一个分区。所以它不能在这里使用。
您可以将Sqrt
的返回值存储在Extended
变量中。然后,您可以使用Trunc,Ceil或Floor切断小数点分隔符后面的部分,并将值存储在另一个Integer
变量中,以便稍后将其与自身相乘并进行比较与x
。看起来像这样:
program project1;
var
x, truncatedSquareRoot : integer;
squareRoot: extended;
begin
writeln ( ' is the inserted number a square of a natural number? ' );
readln (x);
squareRoot := sqrt(x);
truncatedSquareRoot := Trunc(squareRoot);
if ((truncatedSquareRoot * truncatedSquareRoot) = x) then
writeln( 'yes' )
else
writeln('no' );
readln;
end.
将一个昂贵的计算结果(例如Sqrt
)存储在一个变量中以避免两次这样做是很有用的。
答案 1 :(得分:1)
可以在一个代码行中更快地完成,而无需额外的变量:只需将int.class.getDeclaredConstructors()
结果与其截断值进行比较即可。例如:
代表sqrt
:x=64
,sqrt(64)=8
,=> trunc(sqrt(64))=8
;
代表(sqrt(64) = trunc(sqrt(64))) = true
:x=65
,sqrt(65)=8,062...
,=> trunc(sqrt(65))=8
;
(sqrt(65) = trunc(sqrt(65))) = false
甚至没有program Naturalnumbers;
var
x : integer;
begin
writeln ( ' is the inserted number a square of a natural number? ' );
readln (x);
if trunc(sqrt(x))=sqrt(x) then
writeln( 'yes' )
else
writeln('no' )
readln;
end;
声明。
if then else
答案 2 :(得分:0)
行中的第一个错误
if (x div sqrt(x)=sqrt(x)) then
是' ='的优先顺序。运算符大于div运算符的运算符。所以编译器认为你在问
if (x div (sqrt(x) = sqrt(x)) then
相当于
if (x div TRUE) then
而不是
if ((x div sqrt(x)) = sqrt(x)) then
但即使后者也会出错,因为div运算符需要两个整数才能使用,而sqrt函数返回一个浮点数。您可以通过尝试编译
之类的行来检查这一点 y := x div 0.1
编译器仍然会抱怨。
所以你可以修复'通过用/替换div来写
if ((x / sqrt(x)) = sqrt(x)) then
这将编译,但仍然无法保证提供正确答案,因为sqrt函数将具有可能产生错误的舍入错误。 Wosi和asd-tm提供的其他答案涵盖了这些问题。