簡體   English   中英

為什么我在這里沒有任何輸出?

[英]Why I am not getting any output here?

在Euler項目中,存在一個名為“最小倍數”的問題。 我試圖解決它並嘗試為該問題編寫代碼。 但是我沒有任何輸出! 問題描述如下:

2520是可以除以1到10的每個數字而沒有任何余數的最小數字。 能被1到20的所有數均分的最小正數是多少?

所以我寫了這個問題的代碼。 首先,我編寫一個代碼來檢查2520是最小的數字是否正確,該數字可以除以1到10中的每個數字而沒有剩余。 對於這個問題,我編寫了以下程序。

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

int main()
{
  int i,j,count = 0,num;

  for (i = 1; count != 10; i++) {
    count = 0;

    for (j = 1; j <= 10; j++)
      if(!(i % j))
        count++;

    if( count == 10 )
      num = i;
  }

  printf("%d\n",num);
}

我得到了這個問題的理想輸出。 但是,每當我編寫此代碼來查找可被1-20整除且沒有任何余數的值時,我都找不到任何輸出。 我編寫了以下代碼,然后編譯並運行,但沒有得到任何結果。 但是該程序仍在運行,每當我按Control + C組合鍵時,該程序就會終止。

問題的代碼.....

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

int main()
{
  long long int i,j,count = 0,num;

  for (i = 1; count != 20; i++) {
     count = 0;

     for (j = 1; j <= 20; j++)
       if (!( i % j))
         count++;

     if (count == 20)
       num = i;
  }

  printf("%lld\n",num);
}

那么問題出在哪里呢?

如果要執行此操作,則可能會有所不同。 讓我們首先考慮一個不是最小的數字,但否則顯然是正確的,並且真的很容易計算:如果您簡單地將2 * 3 * 4 * 5 * 6 * ... N相乘,您得到的數字就是顯然可以被所有較小的數字整除。

現在的問題是,如何生成一個較小的數字,其基本特征是可以被所有較小的數字整除。 我們可以通過觀察(例如)2 * 2 * 5的10個因子來做到這一點,因此(例如)我們不必分別乘以2、4或5即可得到可被2、4和5整除的結果。 5,

因此,我們可以獲取數字列表以及每個數字的素因式分解:

10: 2 * 2 * 5
9:  3 * 3
8:  2 * 2 * 2
7:  7
6:  2 * 3
5:  5
4:  2 * 2
3:  3
2:  2
1:  1

然后,我們可以消除列表中較晚出現在列表中較早的因素(但最多可以消除它們在列表較早出現的次數)。 這給了我們這樣的東西:

10: 2 * 2 * 5
9:  3 * 3
8:  2
7:  7
6:  -
5:  -
4:  -
3:  -
2:  -

將剩下的部分相乘(2 * 2 * 5 * 3 * 3 * 2 * 7),我們得到了我們期望的2520。

將相同的技術應用於20,我們得到如下列表: 20 19 9 17 4 7 13 11 將其相乘得到232792560

如果您更關心效率,則可以(例如)使用Euclid算法計算一對數字的GCD。 我們在這里計算的是一對數字的LCM,這是數字除以GCD的乘積。 然后,我們可以重復使用以前的LCM作為GCD的輸入之一,因此最終得到如下代碼:

unsigned LCM = max;

for (int i = max - 1; i > 1; i--)
    LCM = i * LCM / GCD(i, LCM);

也有很多方法可以計算GCD。 Euclid算法是一種簡單,眾所周知且相當有效的算法,它看起來像這樣:

unsigned GCD(unsigned u, unsigned v) {
    while ( v != 0) {
        unsigned r = u % v;
        u = v;
        v = r;
    }
    return u;
}

使用此方法,在我目前使用的計算機上,從5到30的每N個計算1..N的LCM(並將它們寫入文件)大約需要3毫秒(盡管我懷疑更仔細的計時會證明這一點)真的比那快)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM