hdu1005 杭电ACM
n%=(i-2);的位置和RuntimeError(ACCESS_VIOLATION)有什么关系?AC代码:#include<stdio.h>main(){intfn[1...
n %= (i-2);的位置和Runtime Error(ACCESS_VIOLATION) 有什么关系?
AC代码:
#include <stdio.h>
main()
{
int fn[10000];
int a, b, n;
fn[1]=fn[2] = 1;
while(scanf("%d%d%d", &a, &b,&n), a || b || n)
{
int i;
a %= 7;
b %= 7;
for(i = 3; i < 10000; i++)
{
fn[i] =(a * fn[i-1] + b * fn[i-2]) % 7;
if(fn[i]==1 && fn[i-1]==1)
{
break;
}
}
n %= (i-2);
fn[0] = fn[i-2];
printf("%d\n", fn[n]);
}
}
Runtime Error
(ACCESS_VIOLATION)
代码:
#include <stdio.h>
int fn[10000];
main()
{
int a, b, n;
while(scanf("%d%d%d", &a, &b,&n) != EOF, a || b || n)
{
int i;
a %= 7;
b %= 7;
fn[1]=fn[2] = 1;
for(i = 3; i < 10000; i++)
{
fn[i] =(a * fn[i-1] + b * fn[i-2]) % 7;
if(fn[i]==1 && fn[i-1]==1)
{
n %= (i-2);
break;
}
}
fn[0] = fn[i-2];
printf("%d\n", fn[n]);
}
} 展开
AC代码:
#include <stdio.h>
main()
{
int fn[10000];
int a, b, n;
fn[1]=fn[2] = 1;
while(scanf("%d%d%d", &a, &b,&n), a || b || n)
{
int i;
a %= 7;
b %= 7;
for(i = 3; i < 10000; i++)
{
fn[i] =(a * fn[i-1] + b * fn[i-2]) % 7;
if(fn[i]==1 && fn[i-1]==1)
{
break;
}
}
n %= (i-2);
fn[0] = fn[i-2];
printf("%d\n", fn[n]);
}
}
Runtime Error
(ACCESS_VIOLATION)
代码:
#include <stdio.h>
int fn[10000];
main()
{
int a, b, n;
while(scanf("%d%d%d", &a, &b,&n) != EOF, a || b || n)
{
int i;
a %= 7;
b %= 7;
fn[1]=fn[2] = 1;
for(i = 3; i < 10000; i++)
{
fn[i] =(a * fn[i-1] + b * fn[i-2]) % 7;
if(fn[i]==1 && fn[i-1]==1)
{
n %= (i-2);
break;
}
}
fn[0] = fn[i-2];
printf("%d\n", fn[n]);
}
} 展开
展开全部
当把 n %= (i-2); 放在 if 语句中时,有可能执行不到这条语句,比如 a 和 b 都是 7 的倍数时,从 fn[2] 以后全部是 0,那么 for 循环一直到结束,都不会执行 if 语句的内容,然后再执行 printf("%d\n", fn[n]); ,当 n 大于等于 10000 时,fn[n] 越界了,当然是运行时错。
而 n %= (i-2); 放在循环外,就可以执行到,n 的值不会大于 10000-2,fn[n] 就没有越过数组 fn 的上界,当然不会出错。
而 n %= (i-2); 放在循环外,就可以执行到,n 的值不会大于 10000-2,fn[n] 就没有越过数组 fn 的上界,当然不会出错。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询