C语言VS2010调试报错
#include<stdio.h>#include<math.h>longlonga[1000010]={1};intmain(){a[2]=1;longlongi,j,...
#include<stdio.h>
#include<math.h>
long long a[1000010] = {1};
int main() {
a[2] = 1;
long long i, j, n, A, b, num;
for (i = 2; i < 1000001; i++)
if (i%2 == 1)
a[i] = 1;
for (i = 3; i < sqrt(1000001.0); i += 2)
if (a[i] == 1)
for (j = i + i; i < 1000001; j += i)
a[j] = 0;
scanf("%lld", &n);
for (i = 0; i < n; i++) {
scanf("%lld", &A);
b = sqrt(A + 0.0);
if (((b * b) == A)&&(a[b] == 1))
num++;
}
printf("%lld\n", num);
return 0;
}
在VS2010下启动调试会显示
0x00000000 处最可能的异常: 0xC0000005: Access violation
然后跳转到一行
__except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )
然后我把
for (i = 2; i < 1000001; i++)
if (i%2 == 1)
a[i] = 1;
这三行删去后发现就不报错了......
求解这到底是什么情况,,因为我是刚刚开始接触这些东西的,希望用简单易懂的语言来回答.. 展开
#include<math.h>
long long a[1000010] = {1};
int main() {
a[2] = 1;
long long i, j, n, A, b, num;
for (i = 2; i < 1000001; i++)
if (i%2 == 1)
a[i] = 1;
for (i = 3; i < sqrt(1000001.0); i += 2)
if (a[i] == 1)
for (j = i + i; i < 1000001; j += i)
a[j] = 0;
scanf("%lld", &n);
for (i = 0; i < n; i++) {
scanf("%lld", &A);
b = sqrt(A + 0.0);
if (((b * b) == A)&&(a[b] == 1))
num++;
}
printf("%lld\n", num);
return 0;
}
在VS2010下启动调试会显示
0x00000000 处最可能的异常: 0xC0000005: Access violation
然后跳转到一行
__except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )
然后我把
for (i = 2; i < 1000001; i++)
if (i%2 == 1)
a[i] = 1;
这三行删去后发现就不报错了......
求解这到底是什么情况,,因为我是刚刚开始接触这些东西的,希望用简单易懂的语言来回答.. 展开
3个回答
展开全部
你的程序中可能有两处错误,请检查:
1 for (i = 3; i < sqrt(1000001.0); i += 2)
if (a[i] == 1)
for (j = i + i; i < 1000001; j += i)
a[j] = 0;
估计你的原意, for (j = i + i; i < 1000001; j += i) 应为 for (j = i + i; j < 1000001; j += i) 注意I和j 区别
2 num使用前要赋初值, 请加上
讨论这两点后,才能继续问题探讨
1 for (i = 3; i < sqrt(1000001.0); i += 2)
if (a[i] == 1)
for (j = i + i; i < 1000001; j += i)
a[j] = 0;
估计你的原意, for (j = i + i; i < 1000001; j += i) 应为 for (j = i + i; j < 1000001; j += i) 注意I和j 区别
2 num使用前要赋初值, 请加上
讨论这两点后,才能继续问题探讨
展开全部
是这一段:
for (i = 3; i < sqrt(1000001.0); i += 2)
if (a[i] == 1)
for (j = i + i; i < 1000001; j += i)
a[j] = 0;
scanf("%lld", &n);
里面的这一句:
for (j = i + i; i < 1000001; j += i)
你用了i < 1000001做循环的限制,只能限制i的值,而j 没有直接限制到,会导致数据越界(即j的值会大于a数组的长度1000010),而你的循环体是对数组赋值:
a[j] = 0;,是j做下标的,当然会报错啦
我猜测是你原本是想写:
for (j = i + i; j < 1000001; j += i)
的?
for (i = 3; i < sqrt(1000001.0); i += 2)
if (a[i] == 1)
for (j = i + i; i < 1000001; j += i)
a[j] = 0;
scanf("%lld", &n);
里面的这一句:
for (j = i + i; i < 1000001; j += i)
你用了i < 1000001做循环的限制,只能限制i的值,而j 没有直接限制到,会导致数据越界(即j的值会大于a数组的长度1000010),而你的循环体是对数组赋值:
a[j] = 0;,是j做下标的,当然会报错啦
我猜测是你原本是想写:
for (j = i + i; j < 1000001; j += i)
的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把那三行改成:
for (i = 3; i < 1000001; i+=2)
a[i] = 1;
这样试试,错误的描述是“访问冲突”。
for (i = 3; i < 1000001; i+=2)
a[i] = 1;
这样试试,错误的描述是“访问冲突”。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询