2017-06-09 25 views
1

私は最初の要素3と次の要素、すなわち、v[i] = (v[i - 1] * v[i - 1]/(i + 2) + v[i - 1] * i + i + 1) % 666013の後に構築された要素で配列のnthの番号を探しています。ここで、vが配列です。私のコードは機能していると思いますが、次の問題があります。 n = 7については最初にy = 600198、次のステップではy = 3755353636であるが、その段階ではy360237639204であると予想した。なぜそれが起こるのですか?私はWindows 7の究極のx64でVisual Studio 2017を使用しています。x * xが正しく計算されないのはなぜですか?

#define _CRT_SECURE_NO_DEPRECATE 
#include "stdafx.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 

int main() 
{ 
    FILE *input; 
    if ((input = fopen("C:\\Users\\HP\\Documents\\Visual Studio 2017\\Projects\\ConsoleApplication2\\hex.in", "r")) == NULL) 
    { 
     perror("Error opening hex.in\n"); 
     return 1; 
    } 
    FILE *output; 
    if ((output = fopen("hex.out", "w+")) == NULL) 
    { 
     perror("Error opening hex.out\n"); 
     return 1; 
    } 
    int n; 
    fscanf_s(input, "%d", &n); 
    int i = 1; 
    unsigned long x = 3; 
    unsigned long y = 8; 
    bool found = false; 
    while(!found) 
    { 
     if (i == n) 
     { 
      found = true; 
      fprintf(output, "%d", x); 
     } 
     i++; 
     x = y; 
     y = x * x;//for i = 7 I expect y to be 360237639204 after this step 
     y /= (i + 2); 
     y += x * i; 
     y += i + 1; 
     y %= 666013; 
    } 
    fclose(input); 
    fclose(output); 
    return 0; 
} 
+1

try 'unsigned long long'、32ビットはその値を保持しません – sp2danny

答えて

3

のVisual Studio C++コンパイラは、まだ32ビットのデータ型として(あまりにも当然とunsigned longlongを持っています。 (少なくとも)64ビットの整数データ型を使用する場合は、long longを使用します。

2

整数がオーバーフローしています.64ビットの変数を使用してください。

unsigned longは、2^32-1までの数字を受け入れることができます。予想よりも少なく、オーバーフローしています。

代わりに使う64ビット変数

unsigned long long x = 3; 
2

32ビット整数は2^32-1(約40億)の値を表します。あなたの望む結果は約360億です。だから、あなたはおよそ360/4 = 90回ぐらいラップしたと想像して、残りの約30億を残しました。あなたが実際に見ている結果です。

代わりに64ビット整数を使用してください。

unsigned long long x = 3; 
unsigned long long y = 8; 
関連する問題