假设该数为 x。
1、则:x + 100 = n^2, x + 100 + 168 = m^2
2、计算等式:m^2 - n^2 = (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。
由于 i * j = 168, j>=2,则 1 < i <= 168 / 2。
因为 i * j =168,所以j = 168 / i,又因为j为整数,所以 168 % i == 0
因为 i * j =168,所以j = 168 / i
因为①m + n = i,②m - n = j,①+② 可得 2m = i+j,所以m=(i+j)/2
因为①m + n = i,②m - n = j,①-② 可得 2n = i-j,所以n=(i-j)/2
因为 x + 100 = n^2, x + 100 + 168 = m^2 ,所以 x = n^2 - 100
因为 x + 100 = n^2, x + 100 + 168 = m^2 ,所以 x = m^2 - 268
只考虑一种单调性,因为 n^2 > 0,即 |n| > 0 ,所以n = ±√(x+100) ,即n关于y轴(或x轴)是对称的,n^2会重复出现2次
必须:x = n^2-100 且 x = m^2 - 268
参考资料:《菜鸟教程:C 练习实例3》https://www.runoob.com/cprogramming/c-100-examples.html
//
// C
reated by crazy_pig on 2022/8/30.
// References from : https://www.runoob.com/cprogramming/c-100-examples.html
//
#ifndef CTEST100_L3_H
#define CTEST100_L3_H
#endif //CTEST100_L3_H
#include
#include
#include
void L3();
//
// Created by crazy_pig on 2022/8/30.
// References from : https://www.runoob.com/cprogramming/c-100-examples.html
//
#include "../include/L3.h"
/**
* 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
* 程序分析:
* 假设该数为 x。
* 1、则:x + 100 = n^2, x + 100 + 168 = m^2
* 2、计算等式:m^2 - n^2 = (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。
* 7、接下来将 i 的所有数字循环计算即可。
*/
void L3() {
printf("\nLesson 3 :\n");
time_t start_time, end_time;
double time_diff;
time(&start_time);
// 由于 i * j = 168, j>=2,则 1 < i <= 168 / 2。
for (int i = 2; i <= 168 / 2; i++) {
// 因为 i * j =168,所以j = 168 / i,又因为j为整数,所以 168 % i == 0
if (168 % i == 0) {
// 因为 i * j =168,所以j = 168 / i
int j = 168 / i;
// 因为①m + n = i,②m - n = j,①+② 可得 2m = i+j,所以m=(i+j)/2
int m = (i + j) / 2;
// 因为①m + n = i,②m - n = j,①-② 可得 2n = i-j,所以n=(i-j)/2
int n = (i - j) / 2;
// 因为 x + 100 = n^2, x + 100 + 168 = m^2 ,所以 x = n^2 - 100
double x1 = pow(n, 2) - 100;
// 因为 x + 100 = n^2, x + 100 + 168 = m^2 ,所以 x = m^2 - 268
double x2 = pow(m, 2) - 268;
// 只考虑一种单调性,因为 n^2 > 0,即 |n| > 0 ,所以n = +-√(x+100) ,即n关于y轴(或x轴)是对称的,n^2会重复出现2次
if (n > 0) {
//必须:x = n^2-100 且 x = m^2 - 268
if (x1 == x2) {
printf("当这个数是%.0lf时:%.0lf + 100 = %d^2 , %.0lf + 268 = %d^2\n",
x1, x1, n, x1, m);
}
}
}
}
time(&end_time);
time_diff = difftime(end_time, start_time);
printf("程序开始时间:%ld,程序结束时间:%ld,程序执行耗时:%f(s)", start_time, end_time, time_diff);
}