c++ - 仅当父循环的所有迭代都为真时,如何执行嵌套的 if 语句?
问题描述
我正在尝试Project Euler 的问题 5。我需要找到能被前 20 个自然数整除的最小整数。
我的想法是将smallest
变量初始化为 2520(正如问题中给出的那样)并在 11 开始循环,然后除以smallest
11 到 20 的数字。如果它可以被 i 的所有值整除,那么系统应该打印smallest
. 否则,它应该增加smallest
1。下面是我到目前为止的代码。
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int smallest = 2520;
for(int i = 11; i<=20; i++){
if(smallest%i==0){
cout<<smallest; //I want this statement to be executed only when the if statement is true for all values of i.
break;
} else {
smallest++; //In case the if statement is false for any value of i, then do this.
}
}
return 0;
}
运行我的代码给了我答案:2522
正确答案是:232792560
目前,如果即使是从 11 到 20 的单个值也可以除法smallest
,那么它会中断循环并打印它,但我希望它只有在 11 到 20 的所有值都可以除法时才打印。
解决方案
由于您已经获得了有关代码的帮助,因此我将尝试研究您的算法。
试着回想你的数学课并记住素数分解(10 = 2*5、12 = 2*2*3 等)。然后回想一下,一个数字可以被一个数字整除当且仅当它可以被它分解成的所有素数整除(在它们的最高幂 - 如果一个数字可以被 2^2 和 3 整除,那么它可以被 12 整除)。
在这种情况下这意味着什么?不要循环遍历〜232000000个数字,而是尝试分解1-20并记录您看到的每个素数的最大功率。然后将所有这些相乘以获得您的答案。
例子。1-10 分解如下:
1 1
2 2
3 3
4 2^2
5 5
6 2*3
7 7
8 2^3
9 3^2
10 2*5
如您所见,这里的最高权力是:
2^3
3^2
5
7
如果我们将它们相乘,那么:2^3 * 3^2 * 5 * 7 = 2520
这是您在问题中得到的示例答案。
分解接下来的 10 个数字,我们得到:2^4 * 3^2 * 5 * 7 * 11 * 13 * 17 * 19 = 232,792,560
。
再去下一个 10 给我们:2^4 * 3^3 * 5^2 * 7 * 11 * 13 * 17 * 19 * 23 * 29 = 2,329,089,562,800
- 循环那么高可能需要一段时间。
无论如何,它与您的代码没有太大关系,但是弄清楚如何编写这个素数分解解决方案可能是一个很好的挑战,而且我认为如果您正在处理 Project Euler 问题,您可能会喜欢看到替代方案方法。:)
推荐阅读
- javascript - 量角器“等待量角器与页面同步时出错”浏览 Angular 站点
- python - 使用 Spotipy 获取当前正在播放的歌曲会出现错误:“'Spotify' 对象没有属性 'currently_playing'”
- python-3.x - 使 pysnmp 可执行文件在 Windows 上运行的正确 pyinstaller 命令是什么
- android - 可以使用 Rsync 以编程方式将文件从 Android 客户端传输到 Linux 服务器吗?
- curl - 如何使用带有 curl 命令的 sftp 复制目录
- sql - 如何创建一个“多请求安全”的 postgresql 函数来生成不同的序列号
- python - 在python中使用datetime库的递归函数的运行时间
- php - 编译后为 PHP 添加 OpenLDAP 支持
- javascript - 在具有相同类名的选择列表中禁用多个特定选项
- php - 更改 WordPress wp_nav_menu 链接类