三冬四夏会不会有点漫长 2023-12-30 11:37 采纳率: 91.7%
浏览 3
已结题

runtime error

#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;
}
  • 写回答

1条回答 默认 最新

  • 柯本 2023-12-30 23:30
    关注

    二个程序还是有区别的,第一个最终的cnt为31624,而第二个为31623
    当你输入测试数据为1000000010时,第一个程序有结果 ,而第二个,下标溢出了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 创建了问题 12月30日