直接两层枚举就行了。
避免排序可以用set。
#include<iostream> #include<cstdio> #include<cstring> #include<set> #include<algorithm> using namespace std; set <int> s; set <int> :: iterator it; int n,stack[20050],cnt=0; int main() { scanf("%d",&n); for (int i=1;i*i<=n;i++) { if (n%i==0) stack[++cnt]=n/i; } for (int i=1;i<=cnt;i++) { for (int j=stack[i];j<=n;j+=stack[i]) { if ((j-2)%(n/stack[i])==0) s.insert((j-1)%n); if ((j+2)%(n/stack[i])==0) s.insert((j+1)%n); } } for (it=s.begin();it!=s.end();it++) printf("%d\n",*it); return 0; }