2016-12-02 7 views
-1

私はこれを私のIT宿題として持っています "猿はN個のロッカーを開き、ロッカー1から始まりロッカーを2インチから2インチ(例:1はクローズ、2 3人は閉じている、4人は開いている)。彼は同じことをやり直すが、3人では3人である。閉じたロッカーを横切ったら、彼はそれを開くだろう。この問題は、どのロッカーが開いたままであるかを知りたがっています。2分2秒から3分3秒に数えて

N = 10の例があり、結果は2,5,10です。 どうしたのですか?

//NOTE : 1-OPEN, 0-Closed 
    int a[10],n,i,j,k=2; 
    cout<<"Cate colivii exista? ";cin>>n; 
    for(i=0; i<n; i++) 
    { 
     a[i]=1; 
    } 
    for(i=0; i<n; i=i+k) 
     { 
      if(a[i]==1) 
       a[i]=0; 
      else if(a[i]==0) 
       a[i]=1; 
      k++; 
     } 
    for(i=0; i<n; i++) 
    { 
     if(a[i]==1) 
      cout<<i<<" "; 
    } 
//K should have been a number but i changed it. 
    return 0; 
} 
+0

現在の結果は何ですか?またはこれを確認するためにプログラムをビルドして実行すると思われますか?また、中間ステップを紙に書いてからプログラムをデバッグする場合は、間違いなく自分で問題を見つける必要があります。 – grek40

+2

forループ内で 'k'をインクリメントします... forループの最初の反復はk = 2、次の反復はk = 3などとなります。あなたは' k'をインクリメントし続けるので、 'i'は'> n 'は非常に速く、ループは終了します。 – Rorschach

+0

@Rorschachが正しいです。ループ内で 'k 'をインクリメントしているので、2 in 2、3 in 3、4 in 4などが1回の繰り返しで発生します。あなたは間違って何をしているのかを理解するために、紙のコードを手作業で行ってみるべきです。 – Yankee

答えて

0

は、私は重要な部分は、二重ループを作成することでした

#include<iostream> 
#include<vector> 
using std::cout; //not using namespace std since that one is too big 
using std::endl; 
using std::vector; 

//declaring but not implementing here, want only to describe what it does here, not how 
//at this place, you might want to write a comment that describes what the function does 
void locker_monkey(const unsigned int amount_lockers); 

//keeping the main function simple 
int main() { 

    //initializing every variable if possible, 
    //also using unsigned int since it should never be negative 
    unsigned int amount_lockers = 0; 
    cout << "Cate colivii exista? "; 
    cin >> amount_lockers; 

    locker_monkey(amount_lockers); 

    return 0; 
} 

enum LockerStatus{ closed, open }; //using enum to make values descriptive 

void locker_monkey(const unsigned int amount_lockers){ 

    //use std::vector instead of array 
    //if created with two arguments, the first is the size of the vector, 
    //the second the default value 
    vector<LockerStatus> lockers_status(amount_lockers, open); 

    //here comes the important part regarding your question, two loops: 
    for(unsigned int k=2; k<amount_lockers; k++){ //outer one increases k 
     for(unsigned int i=0; i<amount_lockers; i+=k){ //inner one increases i 
      if(lockers_status[i] == open){ //more descriptive that a[i] == 1 
       lockers_status[i] = closed; 
      }else{ 
       lockers_status[i] = open; 
      } 
     } 
    } 

    cout << "open lockers: "; 
    for(unsigned int i=0; i<amount_lockers; i++){ 
     if(lockers_status[i]==open) 
     cout<<i<<" "; 
    } 
    cout << endl; //you forgot that part in your code - you want to finish your line 
} 

C++スタイルのためのCスタイルを交換し、一緒にいくつかのことを改善して、それを書き直した、それは

for(unsigned int k=2; k<amount_lockers; k++){ 
     for(unsigned int i=0; i<amount_lockers; i+=k){ 

であります私が問題を正しく理解していれば、少なくとも。

初心者なので、コードを少し改善することはできないと思いました。

+0

'locker_monkey'はインライン関数ではないはずです(この場合、ポイントはありません)。私は間違いなく計算を行うためにコードから入力を読むためにコードを分離するでしょう。 (私はおそらく 'main'のままにしておきます。)' void locker_monkey(unsigned locker_count) 'は、テストとデバッグのはるかに簡単な関数です。 –

+0

@MartinBonnerそうです、それを変更しました。他に何かが見える場合は、編集をしてください。 – Aziuth

+0

@Aziuthおはよう、ありがとう、プログラムの書き直しのために。私はそのダブルループについてのアドバイスを得て0から鉱山を書き直しました。私はあなたのものと私のものを集めました。amount_lockersが10の場合、結果は0,1,4,9になります。問題はそれが2,5,10であると主張しています。 –

関連する問題