2017-07-09 37 views
-1

私はこの質問が既に尋ねられていることを知っていますが、これは異なっています。私は螺旋数の2次元配列と素数のベクトルを生成しています。このプログラムの目標は、スパイラル数配列の対角上の素数の比を求めることです。私は両方の配列をテストして、うまく動作します。私は渦巻きの数字を見るために小さな値のGのために2次元配列を印刷しました、そして、それは働いています。私は理解していないことは、私はNの値を選択するとき以上8000この問題は、巨大なグローバルの使用によって引き起こされる"エラー193%1は有効なwin32アプリケーションではありません"

#include <iostream> 
#include <iomanip> 
#include <cmath> 
#include <vector> 

//Error 193 %1 is not a viable win32 app 
constexpr unsigned long long N = 7800; //for values of N above 8000?? 
constexpr unsigned long long G = 2*N + 1; 
static unsigned long long arr[G][G]; 
//we only need primes up to G 
constexpr unsigned long long P_LIMIT = 50000;//more than enough 
std::vector < unsigned long long > prime(P_LIMIT); 

void generate_primes (void) 
{ 
prime[0] = 2, prime[1] = 3, prime[2] = 5; 
unsigned long long index = 3; 
unsigned long long p; 

for (p = 7; index < 50000; p += 2) 
{ 
    int isPrime = 1; 
    unsigned long long test_limit = (unsigned long long) sqrt(p); 

    for (unsigned long long i = 1; prime[i] <= test_limit; i++) 
    { 
     if (p % prime[i] == 0) 
     { 
      isPrime = 0; 
      break; 
     } 
    } 

    if(isPrime) prime[index++] = p; 
} 

} 

void fill_spiral (void){ 
unsigned long long i = 0, j = 2*N, k, n = G, l; 

for (l = 1; l <= N; l++) 
{ 
    arr[i][j] = n*n; 
    arr[i][i] = arr[i][j] - n + 1; 
    arr[j][i] = arr[i][j] - 2*n + 2; 
    arr[j][j] = arr[i][j] - 3*n + 3; 

    for (k = i+1; k < j; k++) 
    { 
     arr[i][k] = arr[i][k-1] + 1; 
     arr[j][k] = arr[j][k-1] - 1; 
     arr[k][i] = arr[k-1][i] - 1; 
    } 

    for (k = j-1; k > i; k--) 
    { 
     arr[k][j] = arr[k+1][j] - 1; 
    } 

    ++i, --j, n -= 2; 
} 

} 
//diagonals of arr[G][G] 
int prime_ratio (void) 
{ 
unsigned long long count = 0; 
double ratio = 0.62; 
unsigned long long side = 3, d = 2.0*side - 1;  
for (unsigned long long i = 1; i <= N; i++) 
{ 
    unsigned long long test = sqrt(arr[N+i][N+i]); 
    int isPrime = 1; 
    for (unsigned long long index = 0; prime[index] <= test; index++) 
    { 
     if (arr[N+i][N+i] % prime[index] == 0) 
     { 
      isPrime = 0; 
      break; 
     }     
    } 

    if (isPrime) ++count; 

    test = sqrt(arr[N+i][N-i]), isPrime = 1; 
    for (unsigned long long index = 0; prime[index] <= test; index++) 
    { 
     if (arr[N+i][N-i] % prime[index] == 0) 
     { 
      isPrime = 0; 
      break;  
     }   
    } 

    if (isPrime) ++count; 

    test = sqrt(arr[N-i][N+i]), isPrime = 1; 
    for (unsigned long long index = 0; prime[index] <= test; index++) 
    { 
     if (arr[N-i][N+i] % prime[index] == 0) 
     { 
      isPrime = 0; 
      break;  
     }   
    } 

    if (isPrime) ++count; 

    test = sqrt(arr[N-i][N-i]), isPrime = 1; 
    for (unsigned long long index = 0; prime[index] <= test; index++) 
    { 
     if (arr[N-i][N-i] % prime[index] == 0) 
     { 
      isPrime = 0; 
      break;  
     }   
    } 

    if (isPrime) ++count; 

    ratio = (double) count/d; 
    std::cout << std::setprecision(15) <<ratio<< "\t" <<side<<std::endl; 
    side += 2, d = 2*side - 1;  
    } 

//std::cout << side << std::endl; 
return 0;  
} 

int main (void) 
{ 
std::cout << "generating primes..." << '\n'; 
generate_primes(); 
arr[N][N] = 1; 
std::cout<< "generating spiral numbers array..." << '\n'; 
fill_spiral(); 
std::cout<< "solving ratio problem..." << '\n'; 
prime_ratio(); 
return 0; 
}  

答えて

0

私は思う(NおよびGは、変数の名前です)、私はこのエラーを取得しない理由であります配列arr[G][G]Nが9000の場合、この配列サイズは9000 * 2 * 9000 * 2 * 8 = 2 592 000 000 - 2GB以上になります。実際にVS2015は、このコードをコンパイルするのを拒否して、配列のサイズが大きすぎると言っています。代わりにヒープに割り当ててみてください。

関連する問題