求一个完全平方数!!完全平方数!

一个自然数能够表示成一个自然数的平方,那么这个自然数是完全平方数。现在有个完全平方数,它加上100后也是个完全平方数,再加上168,还是一个完全平方数。请写出一个程序,来算出这个数是多少?

大神来这里看看啊?

 #include <iostream>

using namespace std;

int main()
{
    int a[100]={0};
    int b=11,c=20,tmp=0;
    int i=1,a_index=0;
    int flag=1;

    do{ 
        tmp=42%i;
        if(tmp==0){
            b=42/i-i;
            if(b>10){
                a[a_index]=b*b-100;
                a_index++;              
            }else
                flag=0;
        }
        i++;
    }while(flag);
    cout<<"the value of a is: "<<endl;
    for(int j=0;j<a_index;j++){
        cout<<a[j]<<endl;
    }
    return 0;
}

这是java写的 但是 这个数貌似不存在
public class TestMath {
public static void main(String[] args) {
int i = 0;
while (i<100000000) {
i++;
if(test(i)&& test(i + 100) && test(i + 268)) {
System.out.println("++++" + i);
}
}
}
private static boolean test(int x) {
for (int j = 0; j <= x / 2; j++) {
if (j * j == x) {
return true;
}
}
return false;
}
}

在weixin 32769751 的提示下
这道题不需要用程序来枚举就算出来了,但是出题人的确要用程序来编,我也费解。下面给出数学推导过程,大家一起看看:
a+100=bb
a+268=cc

bb+168=cc
则 (c+b)(c-b)=168
令 c-b=x
则(x+2b)x=168
b=84/x-x/2
c=84/x+x/2
令x=2y
b=41y
c=43y
则168yy=168 only y=1
所以 x=2,b=41 c=43,a=1581,
so only a=1581
不需要枚举啊。。。。。。。这样就不需要程序了呀。。。。。。。。哎。

上面的解法有点问题,下面更正下,从”x=2y“开始忽略(后面的结果,太丢人了,呜呜,下面我会很仔细的),给出程序
#include

using namespace std;

int main()
{
int a[100]={0};
int b=11,c=20,tmp=0;
int i=1,a_index=0;
int flag=1;

do{ 
    tmp=42%i;
    if(tmp==0){
        b=42/i-i;
        if(b>10){
            a[a_index]=b*b-100;
            a_index++;              
        }else
            flag=0;
    }
    i++;
}while(flag);
cout<<"the value of a is: "<<endl;
for(int j=0;j<a_index;j++){
    cout<<a[j]<<endl;
}
return 0;

}
运行结果是:
the value of a is:
1581
261
21

算法就是:
a+100=bb
a+268=cc

bb+168=cc
则 (c+b)(c-b)=168
令 c-b=x
则(x+2b)x=168
b=84/x-x/2
c=84/x+x/2
令x=2y则
b=42/y-y
c=42/y+y
然后依次枚举能被42整除的y。
枚举的循环条件是b>10,因为从a+100=bb来看,b不能小于10。
所以,还是需要枚举,还是需要程序。

其实也可以不用程序就能算出来,当然要逻辑推理。我的思路是这样的:用数列来解答
首先完全平方数就是这样:1,4,9,16,25,36,49,64……
他们有个特点,他们每两个之间的差是这样:3,5,7,9,11,13,15……是一个等差数列。
放到这一题中,100就可以认为是等差数列其中一段的和。
而这个等差数列的和也有规律:因为他们都是奇数,根据奇数个奇数的和还是奇数,偶数个奇数的和是偶数这个规律,我们可以得出结论:
100是这个数列中偶数个连续项相加的结果。
而对于这个数列偶数个数相加的情况,可以用等差数列的求和公式来解:数的个数乘以这些数的中位数(中位数,举个列子5和7的中位数是6,
5和9的中位数是7,就是这两个数相加的和除以2)即是和。
因为这个等差数列的等差是2,所以中位数也很有特色,偶数个数的时候,中位数是偶数,奇数个数的时候中位数是奇数。
这里100是偶数,则中位数是偶数。
那么我们可以得出结论:100应该是哪两个偶数的乘积呢?两种情况:10乘10 ,,,50乘2
下面来分析这两种情况:
1,如果是10乘10,也就是说,有十个数,中位数是10,那么我们得到这十个数,最中间的两个数是9和11,这个数列也出来了,
是1,3,5,7,9,11,13,15,17,19。但是我们得知道,这个数列是由完全平方数的后一个数减前一个数得到的,最小的应该是3,这里得到的
是1,所以这种情况不行,pass
2、如果是50乘以2呢,有得分两种情况,数的个数是50和数的个数是2,用第一种情况分析就知道,个数是50肯定不行,第一个数都成负的了。
那么就剩个数是2这种情况了,这就简单的多了,两个数中位数是50,答案很显然是49,51。得到数列之后,我们该找完他前面的完全平方数了。
3,5,7,9,11,13,15,17……这个数列的通项公式是:2n+1,也就是说第n项的数是2n+1,那么49是第24(别说2n+1=49都算不出来是几)项。
而1,4,9,16,25,36,49,64……这些完全平方数通项公式是:n的平方。到这里,我们就求出这个完全平方数是24的平方即576。
下面验证一下:576加100等于676,而676是26的平方。
按这一题来,还要加168,得到844,而28的平方是784,29的平方是841,30的平方是900,好吧,这题无解了。

话说楼主没有抄错题??确定是168而不是108??如果是108的话,得到784便是28的平方,这题就有答案了,结果是576!!!!

暴力法:
#include "stdio.h"
#include "math.h"
int main()
{
for(int i=0;i<1000;i++){
int n=floor(sqrt(i)+0.5);
int k=floor(sqrt(i+100)+0.5);
int j=floor(sqrt(i+208)+0.5);
if(nn==i && kk==i+100 && j*j==i+208){
printf("%d ",i);
break;
}
}

return 0;

}