2012-01-12 89 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)。 我建议你减少变量。代码将会更可读,并且错误的可能性会下降。