#include<stdio.h> int main() { int j=0,i,M,N,rest

#include int main() { int j=0,i,M,N,rest; long long a[10000001]={0}; scanf("%d %d",&N,&M); rest=N; for(i=1;rest!=1;i++) { if(a[i]==0) j++; if(j==M) { a[i]=M; j=0; rest--; } if(i==N) i=0; } for(i=1;i<=N;i++) if(a[i]==0) printf("%d\n",i); return 0; } 这个数组不能定义很大,所以不知道怎么办了,求大佬指导!!!

搜索 约瑟夫环问题 可以找到链接 算法科普:什么是约瑟夫环-五分钟学算法 ,里面详细讲解了几种算法。数组求解和循环链表会堆溢出,递归求解会栈溢出。迭代法最好。下面代码运行通过了。

#include <stdio.h>

int Joseph(int n,int m)
{
    int i;
    int x,y;
    if(n <= 1 || m <= 1)
        return -1;
    if(m % 2 == 0)
        y = 1;
    else
        y = 2;

    for(i = 3; i <= n; i++)
    {
        x = (y-1 + m) % i + 1;
        y = x;
    }
    return y;
}
int main()
{
    int n,m,x;
    printf("输入 n 和 m :\n");
    scanf("%d %d",&n,&m);
    x=Joseph(n,m);
    printf("最后一个数为:%d\n",x);
    return 0;
}


// Output
输入 n 和 m :                                                                                                                                                                        
10000000 3                                                                                                                                                                         
最后一个数为:3093025   

附注:求赞助积分和C币。加入CSDN将近20年了。最近几年忙小孩没登录。刚才搜索到一本电子书想下载,需要20积分/C币。赞助多少都可以。多谢。

你不需要用long long类型呀。改为long因该就可以了。long类型可以有2的31次方,即2,147,483,648数据单元,大于要求的10000000,这样只要40MB空间。