鱼C论坛

 找回密码
 立即注册
查看: 1727|回复: 11

想知道这个程序怎么优化才会

[复制链接]
发表于 2023-8-9 17:22:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  3. */
  4. #include<stdio.h>
  5. void main()
  6. {
  7.         int x;
  8.         int i = 0;
  9.         for (x = 100; i == 0; x++)
  10.         {
  11.                 if (x * x == 100 + x)
  12.                         if (x * x == 168 + x)
  13.                         {
  14.                                 printf("%d", x);
  15.                                 i = 1;
  16.                         }
  17.                         else
  18.                                 i = 0;
  19.                 else
  20.                         i = 0;
  21.         }
  22. }
复制代码


我写的运算老半天都没结束,想看看大家还有别的思路不?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-9 17:22:59 | 显示全部楼层
这段代码可以通过优化来提高效率。目前的实现使用了两个嵌套的循环,对数值进行递增并进行完全平方数的比较。这种方法效率较低。

下面我给出一个优化的思路:

1. 假设所求的整数为n。
2. 根据题目要求,n+100是一个完全平方数,n+168也是一个完全平方数。
3. 设m = n + 100,k = n + 168,分别表示两个完全平方数。
4. 设m的完全平方根为p,k的完全平方根为q。
5. 根据完全平方数的性质,p*p = m,q*q = k。
6. 根据题意得到以下两个等式:p*p = n + 100,q*q = n + 168。
7. 整理得到:p*p - q*q = (n + 100) - (n + 168),即p*p - q*q = -68。
8. 根据差平方公式,p*p - q*q = (p+q)(p-q) = -68。
9. 枚举p+q和p-q的所有可能性,找到满足条件的整数解。其中,p+q > p-q,因此我们只需要枚举p+q即可。
10. 循环遍历p+q的值,直到找到满足条件的解。在循环中,计算p和q的值,并验证是否满足等式。如果满足,则找到了所求的整数n。
11. 输出该整数n,并结束循环。

以下是优化后的代码实现:

  1. #include <stdio.h>

  2. int main() {
  3.     int p, q;
  4.     int n;

  5.     for (int sum = 101; ; sum++) {
  6.         p = sum / 2;
  7.         q = sum - p;
  8.         
  9.         if (p * p - q * q == -68) {
  10.             n = p * p - 100;
  11.             printf("%d", n);
  12.             break;
  13.         }
  14.     }

  15.     return 0;
  16. }
复制代码


优化后的代码只需进行一次循环,通过枚举p+q的值来寻找满足条件的解。这样可以减少不必要的计算,提高代码的效率。

希望这个优化方案能对您有用!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-9 17:23:04 | 显示全部楼层
C/C++交流

这是一个找出满足一定条件的整数的问题。当前的代码使用了简单的循环和条件判断,但是在执行速度上可能存在一些性能瓶颈。下面我给出一种优化思路,使用数学方法来加快程序的执行速度。

首先我们观察题目要求,一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数。设这个整数为x:

1. x + 100 = m^2,其中m为整数;
2. x + 100 + 168 = n^2,其中n为整数。

根据以上两个式子,我们可以得到:

1. m^2 + 168 = n^2;
2. (n - m)(n + m) = 168。

现在的问题就变为找到满足上述条件的n和m。我们可以通过遍历n和m的可能取值,并计算(n - m)和(n + m)的结果,若乘积等于168,则找到了符合条件的x。以下是相应的代码优化示例:
  1. #include <stdio.h>
  2. int main() {
  3.     int n, m;
  4.     int x;
  5.     for (n = 1; n <= 168; n++) {
  6.         if (168 % n == 0) {
  7.             m = 168 / n;
  8.             if ((n - m) % 2 == 0 && (n + m) % 2 == 0) {
  9.                 x = (n + m) / 2 * (n - m) / 2 - 100;
  10.                 printf("%d\n", x);
  11.             }
  12.         }
  13.     }
  14.     return 0;
  15. }
复制代码

在这个优化后的代码中,我们使用两层循环遍历n和m的取值范围,通过求解(n - m)和(n + m)的乘积等于168的整数解来找到满足条件的x。当找到符合条件的x时,将其打印出来。

希望以上优化方案能满足您的需求。如果您有任何问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-9 17:23:10 | 显示全部楼层
这个程序可以通过优化来加快运行速度。目前的代码使用了嵌套的循环来遍历所有可能的整数,这样的做法效率较低。我们可以通过数学推导来优化这个程序。

首先,我们假设该整数为n,根据题目描述,可以得到以下两个方程:

n + 100 = m^2 (m为完全平方数)
n + 168 = k^2 (k为完全平方数)

将这两个方程相减,可以得到:k^2 - m^2 = 168

进一步化简,可以得到:(k + m)(k - m) = 168

现在我们需要找到所有满足上述方程的k和m的组合,然后再判断是否满足题目要求。

我们可以将168分解成两个因数的乘积,列出所有的因数对:

1 * 168
2 * 84
3 * 56
4 * 42
6 * 28
7 * 24
8 * 21
12 * 14

对于每个因数对(k + m, k - m),我们可以求解出k和m的值,并判断是否满足题目要求。如果满足,即找到了符合条件的整数n。

下面是优化后的代码:

#include <stdio.h>
#include <math.h>

int main() {
    int n, m, k;
    for (int i = 1; i <= 168 / 2; i++) {
        if (168 % i == 0) {
            k = (168 / i + i) / 2;
            m = (168 / i - i) / 2;
            if (m * m == n + 100 && k * k == n + 168) {
                printf("%d\n", n);
                break;
            }
        }
    }
    return 0;
}

优化后的代码使用了一个循环来遍历所有可能的因数对,然后计算出对应的k和m的值,并判断是否满足题目要求。当找到符合条件的整数n时,输出结果并跳出循环。

这样的优化可以大大减少运行时间,因为我们只需要遍历168的因数对,而不是遍历所有可能的整数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-9 17:23:46 | 显示全部楼层
你们是魔鬼吗?好快啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-9 17:35:08 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-9 17:23
C/C++交流

这是一个找出满足一定条件的整数的问题。当前的代码使用了简单的循环和条件判断,但是在执行速 ...

你这个超快,但是结果不对欸
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-9 17:35:44 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-9 17:23
C/C++交流

这是一个找出满足一定条件的整数的问题。当前的代码使用了简单的循环和条件判断,但是在执行速 ...

还是久,等了四分钟多我就退出来了哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-9 17:41:47 | 显示全部楼层
isdkz 发表于 2023-8-9 17:23
这个程序可以通过优化来加快运行速度。目前的代码使用了嵌套的循环来遍历所有可能的整数,这样的做法效率较 ...
这个程序可以通过优化来加快运行速度。目前的代码使用了嵌套的循环来遍历所有可能的整数,这样的做法效率较低。我们可以通过数学推导来优化这个程序。

首先,我们假设该整数为n,根据题目描述,可以得到以下两个方程:

n + 100 = m^2 (m为完全平方数)
n + 168 = k^2 (k为完全平方数)

将这两个方程相减,可以得到:k^2 - m^2 = 168

进一步化简,可以得到:(k + m)(k - m) = 168


你这个是不是算错了,相减应该是68,进一步化简是咋得来的呀,如果是从上面,难道不是(k-m)(k-m)=68吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-9 17:47:53 | 显示全部楼层
倔强青铜铜 发表于 2023-8-9 17:41
你这个是不是算错了,相减应该是68,进一步化简是咋得来的呀,如果是从上面,难道不是(k-m)(k-m)=68 ...


gpt确实算数不是很准,相减确实应该是 k^2 - m^2 = 68

然后由平方差公式可得 (k+m)(k-m) = 68

平方差公式看这里
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-9 17:50:35 | 显示全部楼层
isdkz 发表于 2023-8-9 17:47
gpt确实算数不是很准,相减确实应该是 k^2 - m^2 = 68

然后由平方差公式可得 (k+m)(k-m) = 68

哈哈哈哈看成×号了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-9 17:57:16 | 显示全部楼层
本帖最后由 学习编程中的Ben 于 2023-8-9 17:58 编辑
倔强青铜铜 发表于 2023-8-9 17:50
哈哈哈哈看成×号了


求给个最佳答案呗!!!求你了!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-9 18:18:26 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define maxSize 100000

  5. int main()
  6. {
  7.     long int i,x,y;

  8.     for(i = -100;i <= maxSize;++i)
  9.     {
  10.         x = sqrt(i+100);
  11.         y = sqrt(i+268);//再加上168,即i+100+168

  12.         if((x*x == i + 100)&&(y*y == i+268))
  13.             printf("%ld\t",i);
  14.     }

  15.     return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表