江西电信套餐介绍2017:如何判断一个数是平方数?

来源:百度文库 编辑:高校问答 时间:2024/04/28 20:49:40
如何判断一个大于0的自然数是否是另外某一个自然数的平方?
请您给出算法,当然我要说明,这个判断过程可不能用开方来算,比如开方取整再平方,如果等于自身就是平方数。
leosongyou,我不是在问完全平方数
wudipaopao,您的算法似乎效率不够高呀,但还是谢谢

二分查找,效率 log(N)

bool IsSqNum( double a )
{
return BinarySearchSqrt( a , 0 , a);
}
bool BinarySearchSqrt( double a , double begin , double end);
{
if(begin>end)
return 0;
if ( ( (begin-end) * (begin-end) ) / 4 == a )
return 1;
if( ( (begin-end) * (begin-end) ) / 4 > a )
return BinarySearchSqrt( a , begin , (begin-end)/2 - 1);
else
return BinarySearchSqrt( a , (begin-end)/2 + 1, end );

}

用循环
××××××××××××××××××
program pf(input,output);
{
program by cnpascal.cn
}
uses crt;
var r:char;
procedure pfjs ;
var a,c,b:longint;
begin
repeat
write ('Input a number(N>=0):');
readln (a);
until a>=0;
if a=0 then writeln ('0^2=0') else begin
c:=0;
b:=1;
repeat
c:=c+b;
b:=b+2;
until (c=a) or (exp(ln((b-1)/2)*2)>a);
if c=a then writeln ((b-1)/2:3:0,'^2=',a) else writeln ('NO!');
end;{if}
end;{procedure pfjs}
begin
clrscr;
repeat
pfjs;
writeln (Again?(Y/N)');
r:=readkey;
writeln (r);
until (r='n') or (r='N');
end.
×××××××××××××××××××××××
以上PASCAL源程序使用了 公式 1+3+5+7+…+(2n-1)=n^2

完全平方数是这样一种数:它可以写成一个正整数的平方
每一个完全平方数要末能被3整除,要末减去1能被3整除。每一个完全平方数要末能被4整除,要末减去1能被4整除。
每一个完全平方数要末能被5整除,要末加上1或减去1能被5整除。

用循环判断不是很容易

然后在看那个自然数是否是另外某一个自然数的平方

Dim i As Integer
Dim j As Integer
j = 36
For i = 0 To j Step 1
If j = i * i Then
MsgBox ("yes")
Exit For
End If
Next

首先您的问题实际上就是判断一个数是否是完全平方数
正如leosongyou提到的
1+3+5+7+…+(2n-1)=n^2
完全平方数是这样一种数:它可以写成一个正整数的平方

//vc6.0 c++下实现
#include<iostream.h>

void main()
{
long m;
cin>>m;

for (long i=1,temp=0; i<m; i++)
{
temp=temp + 2*i-1;

if (temp==m){
cout<<m<<"="<<i<<"*"<<i<<endl;
break;}
if (temp>m){
cout<<"no"<<endl;
break;}
}
}

输入10000
结果
10000=100*100