不写第二个for循环是不可能的(目前人类的数学而言)!除非你是已经把结果存在一个数组里,那就相当于已知答案求答案,也没有意义了。或者是用一个子函数代替了第二个for循环,或者用while之类的,那是钻牛角尖,本质上还是循环
因为还没有研究出任何的连续质数的准确的递推关系式,(有质数分布规律的关系式,但不是100%准确的)
所以,只能假设这个数可能是质数,再来求证。
不过你的程序可以做下列改进,大大加快执行速度:
第二个for循环:
for (int j = 2; j < i; j++) {
j不需要遍历到i-1,只要遍历到 根号i的向下取整就够了。因为:如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。这样一来时间复杂度有O(n^2)降低到O(n^1.5)
而且j也一样,可以直接从3开始除,j+=2。因为你i都已经是奇数了,i/2还要判断吗?
所以第二个for循环可以改为:
//sqrt_i 如果不提前算好,把sqrt函数搞进第二个for循环去遍历,计算量会非常的大!其实还可以自己用乘法试乘来代替此语句,因为i是单调递增的,sqrt_i也必然是。
int sqrt_i=(int) sqrt((double) i );
for (int j = 3; j < sqrt_i; j+=2 ) {
//...
事实上,j不需要等于所有奇数,只要等于所有质数就行了,但搞质数的程序比较麻烦,而且该程序规模不大,没有必要。