这道题哪里错了?(C++)

鲲鲲现在有小幸运数了。鲲鲲的小幸运数必须满足两个条件:这个数的立方的个位是7;这个数必须是素数。现在鲲鲲想知道2到N中有多少个他的小幸运数,你能帮助他找出来吗?
输入格式
给出一个正整数N(N<=10000000)
当N为0时结束程序。
测试数据不超过100组。
输出格式
从小到大将2~N范围内所有鲲鲲的小幸运数输出。两个数之间用空格隔开
样例输入
13
10
0
样例输出
3 13
3

#include <iostream>
using namespace std;
int main() {
    long long n = -1;
    while (n != 0) {
        bool s = 1;
        cin >> n;
        for (long long i = 2; i <= n; i++) {
            for (long long j = 2; j <= i / 2; j++) {
                if (i % j == 0) {
                    s = 0;
                    break;
                }
            }
            long long d = i * i * i;
            if (d % 10 == 7 && s == 1) {
                cout << i << " "; 
            }
        }
        cout << endl;
    }
    return 0;
} 

为啥一直输出3?

在内循环上面加一行初始化代码

#include <iostream>
using namespace std;
int main() {
    long long n = -1;
    while (n != 0) {
        bool s = 1;
        cin >> n;
        for (long long i = 2; i <= n; i++) {
            //加一行初始化代码
            s = 1;
            for (long long j = 2; j <= i / 2; j++) {
                if (i % j == 0) {
                    s = 0;
                    break;
                }
            }
            long long d = i * i * i;
            if (d % 10 == 7 && s == 1) {
                cout << i << " "; 
            }
        }
        cout << endl;
    }
    return 0;
} 


适当优化一下

#include <iostream>
using namespace std;
int main() {
    long long n = -1;
    while (n != 0) {
        bool s = 1;
        cin >> n;
        for (long long i = 2; i <= n; i++) {
            s=1;
            for (long long j = 2; j*j<=i; j++) {
                if (i % j == 0) {
                    s = 0;
                    break;
                }
            }
            if(s==0)
                continue;
            long long d = i * i * i;
            if (d % 10 == 7) {
                cout << i << " "; 
            }
        }
        cout << endl;
    }
    return 0;
} 
 

优化思路:1.立方为7,位数必定为3, 外循环次数降低到1/10