2014-07-15 72 views
-2

我正試圖解決關於spoj的INTEGER1問題。我的方法非常簡單。它首先計算從2到63的所有冪的x(x^i = n)。然後刪除所有重複,然後最終累加冪。但它正在給我錯誤的答案。 我已經在Ideone和我的機器上嘗試了很多用例,但它給了我正確的結果。爲什麼spoj爲這個「Integer功能」的解決方案提供了錯誤的答案?

#include<stdio.h> 
#include<math.h> 
int main() 
{ 
    unsigned long long int a,b,result; 
    unsigned long long int power[65],temp; 
    int i,j; 

    while(1) 
    { 
     scanf("%lld",&a); 
     scanf("%lld",&b); 
     if(a==0) 
      break; 
     result=0; 
     power[0]=0; 
     power[1]=b-a+1; 

     a--; 
     for(i=2;i<64;i++) 
     { 
      power[i]=floor(pow((long double)b,(long double)1/i)); 
      while(pow((power[i]-1),(long double)i)>=b) 
      { 
       power[i]--; 
      } 
      while(pow((power[i]+1),(long double)i)<=b) 
      { 
       power[i]++; 
      } 

      temp=floor(pow((long double)a,(long double)1/i)); 
      while(pow((temp-1),(long double)i)>=a) 
      { 
       temp--; 
      } 
      while(pow((temp+1),(long double)i)<=a) 
      { 
       temp++; 
      } 
      power[i]-=temp; 
     } 
     for(i=63;i>=1;i--) 
     { 
      for(j=i*2;j<64;j=j+i) 
      { 
       power[i]-=power[j]; 
      } 
     } 
     for(i=1;i<64;i++) 
     { 
      result+=i*power[i]; 
     } 
     printf("%lld\n",result); 
    } 

    return 0; 
} 

請幫我一把。

+2

你讀過關於挑戰的任何意見?請同時閱讀[每位計算機科學家應瞭解的浮點算術知識](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Deduplicator

+0

@Deduplicator我讀過但我認爲我可以使用它來計算根目錄。但非常感謝您提供了這個有用的鏈接。這是否意味着我必須自己計算第n個根?如果可以,請給我也鏈接? – Naman

+0

http://en.wikipedia.org/wiki/Nth_root_algorithm – deviantfan

回答

1

爲輸入

100 100 
10000 100000000 
100000000000 100000000000 
100000000000000 100000000000000 
1000000000000000 1000000000000000 
0 0 

你的輸出

2 
100001508 
11 
14 
11 

但正確的輸出是

2 
100001508 
11 
14 
15 

現在尋找的akth根..doing一些數學

let x = a^(1/k) (^ denotes power NOT XOR)(this is also `kth` root of `a`) 

採取自然對數(LN)雙方

ln x = ln (a^(1/k)) = (1/k) * ln (a) {property of log} 

現在正在exponent雙方

exp (ln x) = exp (ln (a)/k) 

,並根據log財產

exp (ln x) = x 

所以我們最終得到

x = exp (ln(a)/k) which is equivalent to `kth` root of `a` 

這裏是一個功能找到它在C

記得在數學上,我們使用ln尋找自然對數C

等同於的 log
double kth_root_finder(long long int a, long long int k) { 
    if (k == 1) { 
     return a; 
    } 
    if (k == 2) { 
     return sqrt(a); 
    } 
    return exp(log(a)/k); 
} 

編輯1:-as在OP指出,會出現溢出,但我不這麼認爲它會happen..consider我們有

a = 1000000000000000000 and k = 2 (worst case)(ignoring second if condition) 

然後

exp(log(1000000000000000000)/2) = 999999999.999999 = 1000000000(if ceil is taken) 

here是一個鏈接,上面的情況.. 所以我不認爲有機會overflow ..如果其中有請指出..

+0

我認爲這種方法也會出現精度錯誤。我應該使用最近的整數或樓層來輸出這個函數嗎? – Naman

+0

最後我得到了AC。我使用了相同的pow函數來獲得root的第一個估計,然後用INT64計算校正精度錯誤。之前我沒有檢查溢出。所以現在我的解決方案檢查溢出與第一次雙重計算然後做INT64計算。非常感謝你的幫助。 – Naman

+0

@Naman: - 恭喜..如果它幫助你可以接受它..我不認爲它會溢出 – rock321987

相關問題