2016-06-27 7 views
-1

私はこの問題をhackerrankで解決しようとしていました。符号なしlong long配列を使用できますか?

N、S、P、Qの4つの整数が与えられます。次の擬似コードでシーケンスを作成するためにそれらを使用します。

a[0] = S (modulo 2^31) 
for i = 1 to N-1 
a[i] = a[i-1]*P+Q (modulo 2^31) 

あなたの仕事は、シーケンス内の別個の整数の数を計算することです。

Sample Input 

3 1 1 1 
Sample Output 

3 

Constraints 

1<= N <= 10^8 
0<= S,P,Q < 2^31 

そして、これはC言語で私の解決策だっ++ ..私はセグメンテーションフォールトを得ていた時間の大半は、..私は、これはビットアレイを使用して解決することになっていた知っている..しかし、この波平が働い理由を知りたいと思いました。

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 


int main() { 
unsigned long long n,s,p,q; 

cin >> n >> s >> p >> q; 

//declaring array to hold sequence 
unsigned long long a[n]; 

// for loop termination 
bool termination_check = true; 

//initializing sequence 
//s<2^31 hence, s modulo 2^31 is always s 
a[0] = s; 

//creating sequence 
for(int i=1;i<n;i++){ 

    //calculating next term of sequence.. 
    a[i] = (a[i-1]*p)+q; 

    //since a[i] modulo 2^31 is a[i] when a[i] < 2^31 
    if(a[i]>=pow(2,31)){ 
     a[i] = a[i]%31; 

     //when the current term matches with any of previous terms of sequence, then the 
     //terms just repeat after that (since p and q are constants) 
     for(int j=0;j<i;j++){ 
      if(a[i]==a[j]){ 
       cout <<i << endl; 

       //i was trying to use break but dont know why, it did not work 
       termination_check = false; 
       break; 
       break; 
      } 
     } 
    } 
} 

//if there was no termination of loop then all the terms are distinct 
if(termination_check){ 
printf("%llu \n", n); 
} 

/* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
return 0; 
} 
+0

「i」は「n」より小さい。 'j'を' i'に、 'i'''を' n'に設定します。だから 'j Benoit

+0

タイトルは実際の問題と何が関係していますか? – sashoalm

答えて

0

はい、unsigned long longの配列をC++で使用できます。しかし、あなたが持っているものは配列ではありません:unsigned long long a[n];は、nが定数であることが必要です。 (これはCでは異なるでしょうが、C++を書いています)。

まだ実行されているのは、CとC++を混在させるコンパイラ拡張ですが、動作は定義されていません。エラー処理は特に欠けているようです。

+0

もしそれが配列でないなら、それは何ですか? – Benoit

+0

Ok ..今私はそれを得る.. "これはCではない"配列ではないと言って、可変長配列を使用することはできません。http://stackoverflow.com/questions/5368531/why-cant-i-create-an-array-of-size-n – manji369

+0

まあ、可変長配列 "はC++では明確に定義されていません。 'std :: vector 'は可変長であり、配列としてレイアウトされていますが、CのVLAと同じではありません。 – MSalters

0

この答えは、コードの以前のバージョンのためでした。コードは今、質問の内側に編集された(J = IとI = N 2回の休憩に置き換え)

iそして、あなたはijを設定する場合

a[i] == a[j] 

が発生したときhappends何を参照してください。 nになります。しかし、inより小さいので、文j<iは真のままです。あなたのforループ、その後runingて維持し、あなたのプログラムの開発は、あなたが割り当てられた新しい値で

a[i] == a[j] 

を評価しようとするので、

a[n] == a[i] 

場合は、実際に求めているが、あなたの配列aはサイズの配列だった場合nこれは未定義の動作につながります。

+0

ありがとうございます。しかし今、私はi = nをforループからjで置き換えようとしました。ほとんどのテストケースでは、同じセグメンテーションフォルトが表示されます。 – manji369

+0

私は理由がわかりません。デバッガで試しましたか?なぜ、あなたのforループで休憩を使用しないようにし、Boolメソッドを作成し、興味のあるケースに遭遇したときにFalseを返し、それ以外の場合はTrueを返すようにするのはどうですか? – Benoit

+0

私はコメントで言いましたが、ブレーク..を使ってみましたが、うまくいきませんでしたので、これを試しました。それにもかかわらず、問題は配列のサイズが大きい場合、特に符号なしlong long配列のサイズにあると感じています。それが何であるかを知りたがっていました。 – manji369

関連する問題