2012-05-18 42 views
1

作爲標題解釋這是一個程序找到1到20之間的lcm數字。我找到了一個算法來做到這一點,這裏是鏈接
http://www.cut-the-knot.org/Curriculum/Arithmetic/LCM.shtml 存在於網頁中的Java小程序可以解釋的算法更好C++程序計算1到20之間的數字(項目歐勒)

問題:我寫的代碼編譯器顯示沒有錯誤,但是當我運行程序發狂的代碼,我想可能會有一些無限loopig但我無法想象出我的生活。我使用turbo C++ 4.5所以基本上如果任何人都可以看看代碼,並幫助我,它會很好。在此先感謝

算法

說,我們需要找到2,6,8-

LCM首先,我們發現至少系列,並添加到它的數量上面,即系列成爲

4,6,8

現在,我們再次找到了至少值和列添加到它的初使值即2

6,6,8

所以下一個迭代成爲

8,6,8

8,12,8

10,12,8

10,12 ,16

12,12,16

14,12,16

14,18,16

16,18,16

18,18,16

18,18,24

20,18,24

20 ,24,24

22,24,24

24,24,24

,你可以在一個點上看到所有的數字變成等於這是我們的LCM

#include<iostream.h> 
/*function to check if all the elements of an array are equal*/ 
int equl(int a[20], int n) 
{ 
int i=0; 

    while(n==1&&i<20) 
{ 
    if (a[i]==a[i+1]) 
     n=1; 
    else 
     n=0; 
     i++; 
    } 
return n; 
} 
/*function to calculate lcm and return that value to main function*/ 


int lcm() 
{ 
int i,k,j,check=1,a[20],b[20]; 
/*loading both arrays with numbers from 1 to 20*/ 
for(i=0;i<20;i++) 
{ 
    a[i]=i+1; 
    b[i]=i+1; 
} 
check= equl(a,1); 

/*actual implementation of the algorith*/ 
while(check==0) 
{ 
    k=a[0];     /*looks for the least value in the array*/ 
    for(i=0;i<20;i++) 
    { 
     if(a[i+1]<k) 
      { 
       k=a[i+1];  /*find the least value*/ 

       j=i+1;   /*mark the position in array */ 

      } 
     else 
      continue; 
    } 
    a[j]=k+b[j];   /*adding the least value with its corresponding number*/ 

    check= equl(a,1); 
} 

return (a[0]); 

/*at this point all numbers in the array must be same thus any value gives us the lcm*/ 
} 

void main() 
{ 
int l; 
l=lcm(); 
cout<<l; 
} 
+4

是不是像20年前發佈的turbo C++ 4.5? –

+0

@JesseGood:我認爲法律之類的Turbo C++在印度是強制性的。 –

+2

只是要提到它:該算法是非常可怕的。很難想象效率不高。該網站應該添加一個很大的警告,說它在實踐中不可用,並且僅用於說明目的(儘管我不寒而慄 - 想它應該說明什麼)。 –

回答

1

在這一行:

a[j]=k+b[j]; 

您使用j但它未初始化所以這是一個巨大的價值,你超出了數組邊界,因此你會得到一個分段錯誤。

你的代碼中還有一些奇怪的事情發生。void main()並且您使用cout而沒有說std::coutusing namespace std;或類似的東西。奇怪的做法。

另外你不覺得你應該傳遞數組作爲參數,如果你打算使lcm()函數?那是int lcm(int a[], int b[]);

您也可以考慮使用調試器,並改進您的編碼實踐。在調試器的幫助下,在將代碼粘貼到編譯器的30秒內發現此錯誤。

你的循環條件爲:

while(n==1&&i<20) 

所以你equl功能將永遠不會返回1,因爲如果n正好是1,則循環只會繼續下去,永遠不會返回1. 但是,你的程序仍似乎沒有返回正確的結果。您可以分割一塊代碼的是發現的最小元素,並用此代替它的清潔度:

int least(int a[], int size){ 
    int minPos = 0; 

    for(int i=0; i<size ;i++){ 

     if (a[i] < a[minPos]){ 
      minPos = i; 
     } 
    } 

    return minPos; 
} 

然後你就可以說j = least(a, 20);調用它。我將爲您的程序留下進一步的工作。考慮調用你的變量而不是i,j,k,a,b

+0

非常感謝....因爲你可以告訴我是新來的C++因此,你給我一天的價值,以處理哈哈怪異的做法....再次感謝我會重新發布,如果我開始工作: ) – rudha

+0

@rudha你有使用這樣一箇舊編譯器的原因嗎?當你嘗試學習時,它很可能會導致問題。您應該使用MinGW [here](http://www.codeblocks.org/downloads/26)嘗試使用CodeBlocks。免費。如果您使用的是Windows,則是列出的第二個文件。祝你好運。 – Cerin

0

equl你功能是使用陣列索引0-20,但陣列只有1-19

jlcm()是未初始化如果第一元件是最小的。它應該在while循環的頂部設置爲0

在下面的代碼中,當i = 19時,您正在訪問a[20],它超出了數組的範圍。應該for(i=0;i<19;i++)

for(i=0;i<20;i++) { 
    if(a[i+1]<k) 

你實際上並沒有使用std命名爲cout。這應該是std::cout<<l

您的包括iostream.h。標準是iostream沒有.h,這可能不適用於這樣一個老的編譯器,而應該使用#define,而不是在這樣一個老的編譯器上工作,而不是硬編碼20。這不是一個錯誤,只是一種風格的東西。

下面的代碼什麼都不做。這是默認行爲

else 
    continue; 
+0

感謝一堆....我會努力工作,只是覺得愚蠢的做出愚蠢的錯誤....哦,很好:)再次感謝 – rudha