2012-01-12 116 views
2

這裏的問題項目歐拉29

考慮一個^ B的所有整數組合2≤一個≤5和2≤b≤5:

2^2=4, 2^3=8, 2^4=16, 2^5=32 
3^2=9, 3^3=27, 3^4=81, 3^5=243 
4^2=16, 4^3=64, 4^4=256, 4^5=1024 
5^2=25, 5^3=125, 5^4=625, 5^5=3125 

如果它們然後被放置在數字順序,與任何重複去除,我們得到的15個不同的方面如下序列:

4,8,9,16,25,27,32,64,81,125,243,256,625,1024,3125

有多少個不同的術語ar e在由a^b產生的序列中2≤a≤100且2≤b≤100?

這裏是我的代碼

int b[10000][300]={}; 
int a[10000][300]={}; 
int main(void) 
{ 
    int i,j,k=0,z; 
    int ticker=2; 
    int carry=0,oi=0; 
    int carry1=0,count=0; 
    for(i=0;i<10000;i++) 
    { 
     a[i][0]=1; 
    } 

    for(k=0;k<100;k++) 
    { 
     for(i=0;i<100;i++) 
     { 
      for(j=0;j<300;j++) 
      { 
       carry1=(ticker*a[k][j]+carry)/10; 
       a[k][j]=(ticker*a[k][j]+carry)%10; 
       carry=carry1; 
      } 
      for(z=0;z<300;z++) 
      { 
       b[oi][z]=a[k][z]; // Storing the number, everytime its multiplied 
      } 
      oi++; 
      carry1=0; 
      carry=0; 
     } 
     ticker++; 
    } 
    int l=0,flag=0,blue=0; 
    for(z=0;z<9900;z++) 
    { 

     for(i=0;i<9900;i++) 
     { 
      for(j=0;j<205;j++) 
      { 
       if(b[z][j]!=b[i][j]) 
       { 
        blue++; 
        break; 
       } 
      } 
     } 
     if(blue==9899) 
     { 
      l++; 
     } 
     blue=0; 
    } 
    printf("\n%d\n",l-99); 
    return(0); 
} 

這是我的解釋。 由於C無法處理大數字,因此我決定通過設計一個用於乘法的算法來存儲由^ b得到的每個數字。即我將該數字的數字存儲在數組中。 然後我檢查數組中的哪些數字是相同的並消除它們。 很簡單。但不知何故,我沒有得到正確的答案,這是9183,並已看過我的代碼幾次,但無法找到故障 幫助我的傢伙。謝謝

+2

您是否嘗試過使用調試器? – 2012-01-12 10:24:38

回答

3

如果我正確理解您的代碼,您將計算最後一個循環塊中的唯一數字。這意味着你根本不會計算16 = 2^4 = 4^2 = 16^1之類的東西。

如果您在不計算它們的情況下計算重複項(只是提示不會破壞問題),則可以用普通的int解決此問題。

+0

謝謝!我無法相信你能讀懂我的代碼:) – 2012-01-12 16:33:14

0

我認爲你的問題是在循環的邊界。例如,您在一次乘法迭代後存儲數字,這意味着(n^1)。 我建議你減少變量。代碼將會更可讀,並且錯誤的可能性會下降。