2016-10-10 13 views
1

こんにちはすべて私は様々な状況下でいくつかのコードを実行するのが難しいです。素数の数、配列内のすべての数、時間の長さ、および素数の数を出力するコードがあります。これはうまくいきますが、同じコードを実行する必要がありますが、char配列を使用する必要があります。 。問題がでてくるところがある。ここのコードはintの配列で、次のとおりです。int配列をchar配列に変更する

#include "stdafx.h" 
#include <iostream> 
#include <time.h> 
#include <stdio.h> 
using namespace std; 

static const int N = 1000; 

int main() 
{ 
    int i, a[N]; 

    clock_t start = clock(); 

    for (i = 2; i < N; i++) a[i] = i; 
    for (i = 2; i < N; i++) 
     if (a[i]) 
      for (int j = i; j*i < N; j++) a[i*j] = 0; 

    start = clock() - start; 

    int primes = 0; 
    for (i = 2; i < N; i++) { 
     if (a[i]) { 
      primes++; 
      cout << " " << i; 
      if (primes % 10 == 0) 
       cout << "\n"; 
     } 
    } 
    printf("\nIt took %d clicks (%f seconds) to find all prime numbers.\n", start, ((float)start)/CLOCKS_PER_SEC); 
    cout << "The number of primes out of " << N << " integers is " << primes << endl; 
    return 0; 
} 

私は単純に配列のための「文字」と「INT」を置き換える、および10のようなものに「N」を設定すると、または100は素数がどのように見えるかを除いてうまく動作します。それ以上のものは何も印刷されません。私はそれが「int」から「char」までのところを変えるだけではなく、被験者に絶望的に失われていることを知っています。私はこれをやり直す必要はないが、配列をbool型に変更すると助けになる。(それはどちらにも意味がない。)

あらゆる種類の洞察力や簡単な解決策が素晴らしいだろう。その間に何かを探し続けるつもりです。ありがとう!

+1

再生できません。 char配列でうまく動作します(明白ですが無害なバグにもかかわらず)。 –

+0

試してみたときにあなたがしたことを聞いてもよろしいですか?あなたは 'int i、a [N]'を 'char i、a [N]'に置き換えましたか、それともそれ以上にありましたか?私はかなり失われています。 – Wil

+0

'a [i]'の最大値は、 'char'が符号付きであるか符号なしであるかによって、127または255です。したがって、これよりも 'N'を高く設定すると、その限界を超えたすべての要素に無効な値を割り当てます。 – Barmar

答えて

0

問題は、ia[i]に保存していることです。 achar配列である場合(それはunsignedの場合)、要素の最大値は8ビット・バイトを有する典型的なシステムを仮定すると、127signedcharデフォルト場合)または255あります。署名されている場合、オーバーフローの結果、実装定義の動作が発生します。符号なしの場合、オーバーフローはモジュロ256をラップします。

あなたが気にするのは、要素の値がゼロであるか非ゼロであるかだけです。そのため、異なる値を入力する必要はありません。それらをすべて1に初期化するだけです。

for (i = 2; i < N; i++) a[i] = 1; 

これは、ブール値に変更したときにも機能します。

+0

清算をありがとう!それが動作するように管理:) – Wil

関連する問題