我正在尝试使用第一个元素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
,但我希望该步骤y
为360237639204
。为什么会这样?我在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;
}
答案 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;