求100到200以内的素数

img


这个程序没有报错
但是结果不对诶
是我的算法设计出错了嘛?

img


实在感谢大家拯救了一个悲惨的大学生


#include <iostream>

bool isPrime(int number) {
    if (number <= 1) {
        return false;
    }

    for (int i = 2; i * i <= number; i++) {
        if (number % i == 0) {
            return false;
        }
    }

    return true;
}

int main() {
    std::cout << "Prime numbers between 100 and 200:" << std::endl;

    for (int i = 100; i <= 200; i++) {
        if (isPrime(i)) {
            std::cout << i << " ";
        }
    }

    std::cout << std::endl;

    return 0;
}

用这方法


#include <stdio.h>
#include <stdbool.h>
bool is_prime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    for (int i = 100; i <= 200; i++) {
        if (is_prime(i)) {
            printf("%d ", i);
        }
    }
    return 0;
}

if(i=n)改为if(i==n)
此外,第10行的换行符没有识别,重新编译一下

你写的代码有如下几个问题:
1.第10行的if(i=n)改为if(i==n),if()内要填条件,i=n是赋值语句,虽然不规范,但是C++编译器并不会报错;
2.内层for循环的大括号。如果大括号内只有一行,可以省去大括号,如果不止一行,那么需要加大括号。如

for (int i=0;i<=10;i++)
    cout<<i<<" ";

就可以不加大括号(加也可以),而

for (int i=0;i<=10;i++)
{
    if (i%2!=0)
        break;
    else
        cout<<i;
}

就需要加括号了。

还可以改进:
1.n=n+2;可改为n+=2;
2.m=m+1;可改为m++;或m+=1;
3.第二行的#include<math.h>可以去掉,因为没有用到math.h头文件的地方;

所以,可以将原来的代码改为

#include<cstdio>
int main()
{
    int n,i,m=0;
    for(n=101;n<=200;n=n+2)
    {
        for(i=2;i<n;i++)
        {
            if(n%i==0)break;
            if(i==n-1)printf("%d\n",n);
        }
        m=m+1;
        if(m%10==0)printf("\n");
    }
    return 0;
 } 
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7625474
  • 这篇博客也不错, 你可以看下判断100到200之间的素数的方法的不断优化
  • 除此之外, 这篇博客: 大数相乘,求两个不超过100位的数的乘积中的 标题大数相乘,求两个不超过100位的数的乘积。(提示:用数组保存两个大数) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 		**例如:
    		输入:
    		2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    		3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    		输出:
    		7407407407407407407407405925925925925925925925926**``
    
    #include <stdio.h>
    int main()
    {
    	int a[100] = {0},b[100] = {0},c[200] = {0};		//定义数组a、b用来存储两个大数,数组c用来存储两大数相乘之积
    	char sa[100] = {0},sb[100] = {0};				//定义两个字符串用来接收两个大数(字符串的长度不收限制)
    	int i,j;										//定义两个循环变量
    	int m = 0,n = 0;								//定义m、n并赋值为0用来记录大数的位次
    	scanf("%s %s",sa,sb);							//用字符串来接收数据
    	while(sa[m] != '\0')							//用两个while循环实现将字符串转换成数组,方便之后的计算
    	{
    		a[m] = sa[m] - '0';
    		m++;
    	}
    	while(sb[n] != '\0')
    	{
    		b[n] = sb[n] - '0';
    		n++;
    	}
    	for(j = 0;j < n;j++)							//for循环嵌套实现两大数相乘并将其乘积放入相同的位次(注意将c[0]位空出来方便解决之后有可能出现的进位问题)
    	{
    		for(i = 0;i < m;i++)
    		{
    			c[i + j + 1] += a[j] * b[i];
    		}
    	}
    	for(i = m + n - 1;i >= 0;i--)					//for循环将c数组里的数实现进位
    	{
    		if(c[i] > 9)
    		{
    			c[i - 1] += c[i] / 10;
    			c[i] %= 10;
    		}
    	} 
    	i = 0;
    	printf("\n这两数相乘之积为:\n");
    	if(c[i] == 0)									//判断c[0]位是否存在进位问题
    	{
    		for(i = 1;i < m + n - 1;i++)
    		{
    			printf("%d",c[i]);
    		}
    	}
    	else
    	{
    		for(i = 0;i < m + n - 1;i++)
    		{
    		printf("%d",c[i]);
    		}
    	}
    	return 0;
    }
    
  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 操作最后一个元素复杂度震荡问题的解决小节, 巩固相关知识点