#include <stdio.h>
const int N = 1e9+10;
int a[1000000];
int main()
{
int cnt = 0;
for (int i = 1; i*i <= N; i += 1)
{
a[++cnt] = i*i;
}
cnt ++;
a[cnt] = cnt*cnt;
int T,n,n0,ans,t;
scanf("%d",&T);
while ( T --)
{
scanf("%d",&n);
n0 = n; t = (n-1)/2;
for (int i = 2; a[i] <= n0; i ++)
while (n0%a[i] == 0)
n0 /= a[i];
if (n0 == n)
{
if (n == 1) puts("0");
else printf("%d\n",(n+1)/2);
}
else
{
for (int i = 1; ; i ++)
{
ans = a[i]*n0 - t;
if (ans >= 0)
{
printf("%d\n",ans);
break;
}
}
}
}
return 0;
}
为什么第一份代码能ac,第二份代码确实runtime error,两份代码只有第八行和第十一行有一些区别
第一份代码cnt从0开始计数,但是使用的第一个下标是1,第二份代码cnt从1开始计数,使用的第一个下标是1,按道理两份代码运行结果应该是一样的
#include <stdio.h>
const int N = 1e9+10;
int a[1000000];
int main()
{
int cnt = 1;
for (int i = 1; i*i <= N; i += 1)
{
a[cnt++] = i*i;
}
cnt ++;
a[cnt] = cnt*cnt;
int T,n,n0,ans,t;
scanf("%d",&T);
while ( T --)
{
scanf("%d",&n);
n0 = n; t = (n-1)/2;
for (int i = 2; a[i] <= n0; i ++)
while (n0%a[i] == 0)
n0 /= a[i];
if (n0 == n)
{
if (n == 1) puts("0");
else printf("%d\n",(n+1)/2);
}
else
{
for (int i = 1; ; i ++)
{
ans = a[i]*n0 - t;
if (ans >= 0)
{
printf("%d\n",ans);
break;
}
}
}
}
return 0;
}