【C 语言经典100例 | 菜鸟教程】C 语言练习实例3

解题思路:

《菜鸟教程:C 练习实例3》程序分析:

假设该数为 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

L3.h

//
// 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();

L3.c

//
// 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);
}

Result:

【C 语言经典100例 | 菜鸟教程】C 语言练习实例3_第1张图片

你可能感兴趣的:(C语言,c语言,c++,开发语言)