有没有办法写if(x div sqrt(x)= sqrt(x)),因为它不起作用

时间:2015-10-11 15:09:12

标签: pascal

我想插入一个数字,程序告诉我这个数字是否是自然数的平方。到目前为止,它说 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;  

3 个答案:

答案 0 :(得分:1)

您尝试x div sqrt(x) xIntegerSqrt函数返回Extended。这是一个浮点数。 div运算符是Integer个数字的一​​个分区。所以它不能在这里使用。

您可以将Sqrt的返回值存储在Extended变量中。然后,您可以使用TruncCeilFloor切断小数点分隔符后面的部分,并将值存储在另一个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()结果与其截断值进行比较即可。例如:

代表sqrtx=64sqrt(64)=8,=> trunc(sqrt(64))=8;

代表(sqrt(64) = trunc(sqrt(64))) = truex=65sqrt(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提供的其他答案涵盖了这些问题。