2016-10-10 154 views
1

大家好我有困難在各種情況下運行一些代碼。我有代碼可以找出有多少素數,數組中的所有數字,所需時間,以及打印多少素數。這一切工作正常,但後來我需要運行相同的代碼,但與一個字符數組。這就是問題的來這裏是代碼,以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; 
} 

當我簡單地用「炭」爲陣列替換「廉政」,並設置「N」爲類似10 ,或100它工作得很好,除了素數看起來如何。任何更高和沒有打印。我知道它不那麼簡單,只是改變它說'int'到'char'的地方,但我對這個主題毫無希望地失去了。沒有幫助,我需要再次這樣做,但將陣列更改爲布爾類型(這對我來說也沒有多大意義。)

任何類型的洞察力或簡單的解決方案將是美好的。在此期間我會繼續尋找某些東西。謝謝!

+1

無法重現。對char數組工作正常(儘管存在明顯的但是無害的錯誤)。 –

+0

我可以問你在試用時做了什麼嗎?你是用'char i,a [N]'替換'int i,a [N]'還是還有更多?我很迷茫。 – Wil

+0

「a [i]」的最大值是127或255,取決於「char」是有符號還是無符號。所以如果你設置的N高於這個值,你會爲超過這個限制的所有元素分配無效的值。 – Barmar

回答

0

問題是您要將i存儲到a[i]中。當achar陣列時,假定典型系統具有8位字節,則元素的最大值爲127(如果char默認爲signed)或255(如果它是unsigned)。如果已簽名,溢出會導致實現定義的行爲;如果它是無符號的,則溢出包含在模256中。

您唯一關心的是元素的值是零還是非零,因此不需要在其中添加不同的值。只需將它們全部初始化爲1即可。

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

當您將其更改爲布爾值時,這也會起作用。

+0

感謝您的澄清!管理使其工作:) – Wil