C语言经典100题---例003--- 完全平方数

目录

题目:

题目分析

C语言实现

输出结果


题目:

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

题目分析

(1) x + 100 = m^2,这里取m>=0

(2) x + 100 + 168 = n^2 即 x + 268 = n^2,这里取n>=0

将(2)减去(1)得到:(n^2 - m^2) = 168

(3) 即 (n-m)(n+m) = 168

设a = n - m, b = n + m,则n+m>0,由(3)知 (n-m)*正数 = 168,所以n-m也是正数

即,n>m.所以有b>a>0.

由于n和m都是整数,所以a和b同奇偶(因为n和m都是整数,那么n+m和n-m同奇偶)

又因为a*b = 168(偶数)。所以a和b都是偶数。

综上:

  • a < b
  • a * b = 168
  • a和b都是偶数
  • 由a和b可以解出n和m: n = (a+b)/2, m = (b-a)/2,且n和m都是正整数(由于a和b都是偶数,所以n和m都是整数)
  • 然后由m或n得到x: x = m^2 - 100
  • 最后验算 x + 100 + 168 = n^2

C语言实现

cpp 复制代码
#include <stdio.h>
#include <math.h>
int main() {

    int a, b, x, m, n;

    printf("---------------------------------------\n");

    // a < b;a * b = 168 所以 a <= sqrt(168)
    for (a = 2; a <= sqrt(168);) 
    {
        b = 168 / a;

        if (a < b && (b % 2 == 0) && (a % 2 == 0))
        {
            n = (a + b) / 2;
            m = (b - a) / 2;
            x = m * m - 100;        // 求出x

            // 再到另一个式子中验算
            if (x+100+168 == n * n)
            {
                printf("%d + 100 = %d ^ 2\n", x, m);
                printf("%d + 100 + 168 = %d ^ 2\n", x, n);
                printf("---------------------------------------\n");
            }
        }
        // a是偶数 所以每次可以+2
        a += 2;
    }
}

输出结果

cpp 复制代码
---------------------------------------
1581 + 100 = 41 ^ 2
1581 + 100 + 168 = 43 ^ 2
---------------------------------------
261 + 100 = 19 ^ 2
261 + 100 + 168 = 23 ^ 2
---------------------------------------
21 + 100 = 11 ^ 2
21 + 100 + 168 = 17 ^ 2
---------------------------------------
-99 + 100 = 1 ^ 2
-99 + 100 + 168 = 13 ^ 2
---------------------------------------
相关推荐
序属秋秋秋9 小时前
《Linux系统编程之进程控制》【进程等待】
linux·c语言·c++·进程·系统编程·进程控制·进程等待
lingran__10 小时前
C语言自定义类型详解 (1.1w字版)
c语言·开发语言
一路往蓝-Anbo15 小时前
C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网
松涛和鸣15 小时前
DAY42 SQLite3 : Dictionary Import and Data Query Implementation with C Language
linux·c语言·数据库·单片机·网络协议·sqlite
水饺编程15 小时前
Visual Studio 软件操作:添加附加依赖项
c语言·c++·windows·visual studio
一路往蓝-Anbo16 小时前
C语言从句柄到对象 (三) —— 抛弃 Malloc:静态对象池与索引句柄的终极形态
c语言·开发语言·数据结构·stm32·单片机·算法
序属秋秋秋16 小时前
《Linux系统编程之进程控制》【进程创建 + 进程终止】
linux·c语言·c++·操作系统·进程·进程创建·进程终止
一路往蓝-Anbo17 小时前
C语言从句柄到对象 (二) —— 极致的封装:不透明指针与 SDK 级设计
c语言·开发语言·数据结构·stm32·单片机·嵌入式硬件
上天_去_做颗惺星 EVE_BLUE17 小时前
C++学习:学生成绩管理系统
c语言·开发语言·数据结构·c++·学习
水饺编程17 小时前
开源项目介绍:VirtuaNES 模拟器
c语言·c++·windows·visual studio