2017-06-05 13 views
0

xの正の値と負の値の両方について、上記の問題の作業コードを考え出しました。大部分の状況に対する答えは正しいですが、コーナーケースでコードが失敗し、問題の内容を見つけることができません。どのような条件私が行方不明です: `pow(x、n)%dを計算中のコーナーケース

int pow(int x, int n, int d) { 
int i=0,rem=1; 
long long l; 
    if(x==0) 
    { 
     return 0; 
    } 
    if(x==1) 
    { 
     return 1; 
    } 
    if(n==0) 
    { 
     return 1; 
    } 
    x=x%d; 
    if(n%2==0||n==0) 
    { 
     l = ((pow(x,n/2,d))*(pow((x),n/2,d)))%d; 
    } 
    else 
    { 
     l = ((x)*(pow(x,(n-1)/2,d))*(pow((x),(n-1)/2,d)))%d; 
    } 
    if(x<0 && n%2!=0) 
    { 
     return d+l; 
    } 
    else 
    { 
     return l; 
    } 
} 

` コードが間違ったANSを与えるのケースを:

A: 71045970 
B : 41535484 
C : 64735492 
My Output: 12942068 
Actual Output:20805472 
+0

このコードは、どこかで 'l'を宣言しない限り、コンパイルすべきではありません。次に、 '&n == 0'の背後にあるアイデアは何ですか?最後に、コーナーケースは何ですか? – sweber

+0

は私にint overflowの問題を抱えています...私はこのようなmodpowを行っています:[モジュラー演算とNTT(有限体DFT)最適化](https://stackoverflow.com/q/18577076/2521214)。また、あなたの 'if 'ステートメントに'() 'の括弧を入れておくと、より安全に感じるでしょう – Spektre

+0

私は明らかに理由のために変数名としてlを使用することを個人的に避けています –

答えて

0

ここであなたの簡易版です。

int pow(int x, int n, int d) { 
    long long l; 
    if(n==0) 
    { 
     return 1; 
    } 
    if(n%2==0) 
    { 
     l = (long long)pow(x,n/2,d); 
     return (int)((l * l) % (long long)d); 
    } 
    else 
    { 
     //check negative value of x, and make it positive, so that negative values never come in result 
     if (x < 0) { 
      x += d; 
     } 
     return (int)(((long long)x * (long long)pow(x,n-1,d)) % (long long)d); 
    } 
} 

私はあなたのコードは、論理的に正しいですが、モジュロd値が十分に大きければintデータ型にデータオーバーフローの問題が存在すると思います。

例えば、 (pow(x,n/2,d))*(pow((x),n/2,d))ここでは、2つの大きなint値の乗算によってデータ型のオーバーフローが発生する可能性があります。

関連する問題