守形数的概念:
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的巴里坤哈萨克网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
若正整数n是它的平方数的尾部,则称n为守形数,又称同构数。
根据定义,可以得到计算的思路。
1 对于范围内的每个数值,计算其平方;
2 根据原数的位数,截取数值的尾部;
3 将数值的尾部与原数比较,如果相等则为守形数。
遍历需要的范围,即2-1000,逐一判断即可得到所有的守形数。
代码如下
#include stdio.h
int main()
{
int i, r, s=1;
for(i = 2; i = 2000; i++)
{
r = i*i;//计算平方。
if(r/(s*10) != 0) s*=10; //获取位数。
r%=s;//得到尾数。
if(r == i) printf("%d\n", i);//是守形数,输出值,每行一个。
}
return 0;
}
输出结果为
5
6
25
76
376
625
double d=625;
double d1=Math.sqrt(d);
String sd1=""+(int)d1;
String sd=""+(int)d;
if(sd.substring(sd.length()-sd1.length(), sd.length()).equals(sd1)){
System.out.println(true);
}else{
System.out.println(false);
}
首先你判断守型数的那个函数是错的,你只判断了N平方数的最后一位跟N是否一样,当然只能找个个位数的守型数了。因为当N位数为两位以上时(比如25) 他的平方数是625,在你拿625的最后一位5跟他比较当然不一样。正确的应该是取最后2位(2即25的位数)。正确的函数应该是:
Private Function Fact(N As Long) As Boolean
Dim M
M = N * N
If Right(CStr(M), Len(CStr(N))) = CStr(N) Then Fact = True
End Function
然后你command1里的代码也要改改,一方面不够简洁,还有你是找1-2000内的,而你代码却是1-100范围的守型数。
Private Sub Command1_Click()
Dim I As Long, K As Integer
For I = 1 To 2000
If Fact(I) = True Then
K = K + 1
Print I,
If K Mod 4 = 0 Then Print
End If
Next I
End Sub