设有一数列{an},其中a1=1,a2=3,a3=8,a4=120,这四个数都满足两两乘积+1是完全平方数,那么a5=?  刚学C,用C写了个程序,编译通过,不过答案110771是错的下面是程序,用的是枚举:
#include <stdio.h>
#include <math.h>int ss (long x)   /*看枚举的b1是不是素数*/
{
long n=2;
for(  ; n<x/2;n++)
{ if(x%n==0)
    return 0;
    }
    return 1; 
}int BJ1(long x)   /*将枚举的b1带入1式求的a5,再带到2式中检验看是不是满足完全平方*/
{
double m1,n1;
m1=sqrt((3*x*x-2);/*不知道这里是不是应该写成m1=sqrt((float)(3*x*x-2);*/
n1=floor(m1);
if(m1==n1) return 1;  /*感觉这里有问题,我每一行的检查过,当x=110771的时候,
    n1返回的是191861,是正确的结果,也就是说m1==n1,应该返回true,但是运行起来返回的却是0.000000*/
else return 0;


}int BJ2(long x)
{
double m2,n2;
m2=sqrt(8*x*x-7);
n2=floor(m2);
if(m2==n2) return 1;
else return 0;
}
int BJ3(long x)
{
double m3,n3;
m3=sqrt(120*x*x-119);
n3=floor(m3);
if(m3==n3) return 1;
else return 0;
}
void main ()
{
     long b=31;
 for (;  ;b++)
 {   if(ss(b)&&BJ1(b)&&BJ2(b)&&BJ3(b))
 {     printf("素数是:  %ld\n",b);
       break;
 }
 }} 我的想法是a1*a5+1=b1*b1;------1
          a2*a5+1=b2*b2;------2
          a3*a5+1=b3*b3;------3
          a4*a5+1=b4*b4;------4
枚举b1(发现b1按规律应该是素数),把b1带到1中求出a5,再把a5带到后面的3个式子里面看能不能的到完全平方,如果能够的到这个素数b1,就可以求出来a5了如上面的程序我在m1=sqrt((3*x*x-2);中加个(float)成m1=sqrt((float)(3*x*x-2);可以得结果b1=110771 ,但是把其他得几个式子也对应加上(float)就没结果了!用的是VC 6.0 ,用C#也写过,也没得答案,望大侠指教答案,真不知道上面的程序有什么错误了!

解决方案 »

  1.   

    设有一数列{an},其中a1=1,a2=3,a3=8,a4=120,这四个数都满足两两乘积+1是完全平方数,那么a5=?  
    我的想法是这样的:
    由条件 只要找出最小的满足分别乘以a1 a2 a3 a4 a5 再加上1是完全平方数就可以了.
     1*a5+1=m^2是完全平方数 所以a5>120 则m>11
    a5=m^2-1
    写了下面的程序,不过没有算出结果来.怀疑sqrt函数精度不够....  bool check(_int64 a5,int n)
    {
    _int64 num=a5*n+1;
    _int64 root=(_int64)sqrt(num);
    return (root*root==num);
    }
    void test()
    {
    for(_int64 i=3;;i++)
    {
    _int64 a5=i*i-1;
    if(check(a5,3) && check(a5,8) && check(a5,120) )
    {
    printf("a5=%d\n",a5);
    break;
    }
    }
    }
      

  2.   

    3m2u(SameToYou)的想法和我一样,用java写了个,机器枚举了一个小时也没答案,所以用C写了个,想速度快点,但是也没答案,怀疑是比较时候sqrt()丢失了数据,精度太小,不过我long double一样没答案。期待高手给个好点的验证子函数!