为什么x * x计算错误?

时间:2017-06-09 14:20:21

标签: c visual-studio-2017

我正在尝试使用第一个元素nth在数组中找到3数字,并在以下规则之后构建下一个元素:v[i] = (v[i - 1] * v[i - 1] / (i + 2) + v[i - 1] * i + i + 1) % 666013。其中v是数组。我认为我的代码工作正常,但我有下一个问题。对于n = 7首先y = 600198,以及下一步y = 3755353636,但我希望该步骤y360237639204。为什么会这样?我在Windows 7旗舰版x64上使用Visual Studio 2017。

#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;
}

3 个答案:

答案 0 :(得分:3)

Visual Studio C ++编译器仍然具有long(当然也是unsigned long)作为32位数据类型。如果需要(至少)64位整数数据类型,请使用long long

答案 1 :(得分:2)

你有整数溢出,尝试使用64位变量。

unsigned long可以接受最多2^32-1的数字,该数字低于您的预期,这就是您有溢出的原因。

使用64位变量:

unsigned long long x = 3;

答案 2 :(得分:2)

32位整数可以表示2 ^ 32-1(大约40亿)值。你想要的结果是大约3600亿。所以你可以粗略地想象它已经包裹了360/4 = 90次,剩余的约为30亿,这是你实际看到的结果。

使用64位整数,正如其他人所说的那样。

unsigned long long x = 3;
unsigned long long y = 8;