题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

//【程序3】
//题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
//1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后
//的结果满足如下条件,即是结果。请看具体分析:
//2.程序源代码:
//#include "math.h" 
//main()
//{
//	long int i, x, y, z;
//	for (i = 1; i < 100000; i++)
//	{
//		x = sqrt(i + 100);   /*x为加上100后开方后的结果*/
//		y = sqrt(i + 268);   /*y为再加上168后开方后的结果*/
//		if (x*x == i + 100 && y*y == i + 268)/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
//			printf("\n%ld\n", i);
//	}
//}
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==


//【程序3】
//题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
/*
[分析]
1 整数X加100取平方,存在M
2 再加168取平方,存在N
3 利用数据丢失,验证是否等于
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(int argc, int **argv){
	int x = 0, m = 0, n = 0;
	for (x = 0; x < 10000; x++)
	{
		m = (int)sqrt(x + 100);
		n = (int)sqrt(x + 268);
		if ((m * n) == (sqrt(x + 100) * sqrt(x + 268)) )
		{
			printf("%d + 100 = %d * %d\n", x, m, m);
			printf("%d + 268 = %d * %d\n", x, n, n);
		}
	}
	return 0;
}

加强

/*
此法不恰当之处:
限制了取值范围,算法不严谨
【更正后】注:来自菜鸟联盟
假设该数为 x。
1、则:x + 100 = n2, x + 100 + 168 = m2
2、计算等式:m2 - n2 = (m + n)(m - n) = 168
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。
5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。
6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。
7、接下来将 i 的所有数字循环计算即可。
*/
#include <stdio.h>

int main(void)
{
	int  i, j, m, n, x;
	for (i = 1; i < 168 / 2 + 1; i++)
	{
		if (168 % i == 0)  //确定j是整数
		{
			j = 168 / i;
			if (i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)
			{
				m = (i + j) / 2;
				n = (i - j) / 2;
				x = n * n - 100;
				printf("%d + 100 = %d * %d\n", x, n, n);
				printf("%d + 268 = %d * %d\n", x, m, m);
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43328180/article/details/85722088