[英]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.