【问题标题】:finding the largest gcd while loop problems寻找最大的 gcd while 循环问题
【发布时间】:2013-05-07 04:05:52
【问题描述】:

我在 Project Euler 中做问题 3 以找到最大的 gcd。我应该找到 600851475143m 的 gcd,但在我这样做之前我想找到一个较小的数字。这是问题的链接,我是用 C 语言编写的。

http://projecteuler.net/problem=3

我的 while 循环有问题。我的算法是有一个增加的数字(i)当且仅当余数为零时才继续划分给定的数字。给定的数字随着它被划分而减少。如果 i 和 the 等于给定数,则 i 是最大的 GCD。

这是我的代码:

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

int main()
{
int origNumber = 13195;
int i = 2;
while(origNumber / i != 1 && origNumber % i != 0)   
{

    if(origNumber % i == 0)
    {
        origNumber = origNumber / i;

    }
    if(origNumber == i)
        break;



    i++;

    printf("origNumber = %d i = %d\n", origNumber, i);
}




}

【问题讨论】:

  • 您能详细说明您遇到的问题吗?
  • Project Euler 网站对发布解决方案非常清楚 - 强烈反对。 projecteuler.net/about

标签: c while-loop


【解决方案1】:

while 循环提前退出是因为

while (origNumber / i != 1  && origNumber % i != 0)
                            ^^^^^^^^^^^^^^^^^^^^^^

当 origNumber 不能被 i 整除时,origNumber % i != 0 将变为 false(这很可能在找到所有除数之前发生。

将循环语句改为-:

while ((origNumber / i) != 1)

【讨论】:

    【解决方案2】:
    #include <stdio.h>
    
    int main(void){
        int origNumber = 13195;
        int i = 2;
        while(i*i<origNumber){
            int isFactor = 0;
            while(origNumber % i == 0)
                isFactor = origNumber = origNumber / i;
    
            if(isFactor)
                printf("i = %d\n", i);
            i++;
        }
        printf("origNumber = %d\n", origNumber);
        return 0;
    }
    

    【讨论】:

    • 此代码可以使用,只需将“int origNumber”更改为“unsigned long long int origNumber”即可用于大的orignumber,例如问题3的号码。
    • @rcpayan "I want to find it with a smaller number before I do so."
    • 谢谢。有人可以向我解释这些变化。所以我能理解算法吗?我这样做只是为了更好地学习编程。
    • @user1217522 if(origNumber % i == 0){ origNumber = origNumber / i; } 这部分需要重复。
    猜你喜欢
    • 2011-09-09
    • 2011-06-19
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多