C语言经典例3-完全平方数

1 题目

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

2 分析

  • 方法1(有缺陷,答案不全):直接用暴力解法,由于不知道数的确切范围,所以假定该数在0到10000内进行求解,求解的方法是使用math.hsqrt()函数求平方根,判断取平方根后是否为整数,若两次取平方根后都为整数,则这个数符合要求,见3.1实现1,这是最常见的方法,当然也是最容易出错的方法,出错的原因在于在题干没有指定数的范围的时候,自行指定了范围,求解前我们并不知道数的范围,所以有相当大的可能造成求解的遗漏,那么补充第二种方法
  • 方法2:本题实际上是一个数学的问题,那么用数学的方法来求解是最稳妥的
    ① 设这个未知数为 x x x ,那么列出符合题意的式子为:
    x + 100 = A 2 x+100=A^2 x+100=A2 x + 268 = B 2 x+268=B^2 x+268=B2 A 2 A^2 A2 B 2 B^2 B2 为构成的两个完全平方数)
    ② 得到 A 2 A^2 A2 B 2 B^2 B2 的关系,两式相减得: B 2 − A 2 = ( B + A ) ( B − A ) = 168 B^2 - A^2=(B+A)(B-A)=168 B2A2=(B+A)(BA)=168
    ③ 令 ( B + A ) = i (B+A)=i (B+A)=i,令 ( B − A ) = j (B-A)=j (BA)=j,即 i ∗ j = 168 i*j=168 ij=168 i i i j j j 中至少一个为偶数
    ④ 则 B = i + j 2 B=\frac{i+j}{2} B=2i+j,则 A = i − j 2 A=\frac{i-j}{2} A=2ij i i i j j j 奇偶性相同,即 i i i j j j 都是偶数,且大于等于2
    ⑤ 令循环变量为i,从 1 1 1循环至 168 2 + 1 \frac{168}{2} + 1 2168+1,通过判断 i i i j j j 就可以求出满足题意的数字,见3.3实现2

3 实现

3.1 实现1(有缺陷,答案不全)

#include<stdio.h>

int main() {
    for (int i = 0; i <= 10000; i++) {
        if (sqrt(i+100)==(int)sqrt(i+100) && sqrt(i+268)==(int)sqrt(i+268)) {
            printf("%d\n", i);
        }
    }
    return 0;
}

3.2 运行结果1(有缺陷,答案不全)

21
261
1581

3.2 实现2

#include<stdio.h>

int main() {
    for (int i = 1; i < 168/2 + 1; i++) {
        if (168 % i == 0) { // i要能被168整除
            int j = 168 / i; // 求出j
            if (i > j && (i + j)%2 == 0 && (i - j)%2 == 0) {
                int B = (i + j) / 2;
                int A = (i - j) / 2;
                int x = A * A - 100;
                printf("%d\n", x);
            }
        }
    }
    return 0;
}

3.3 运行结果2

-99
21
261
1581
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值