C#求100以内的质数

weixin_44626304 2019-02-15 08:27:08
加精
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace myprim
{
class Prim
{
static void Main(string[] args)
{
int count;
int prim=2;
Boolean cix=false;
Console.WriteLine("prim={0}", prim);//2为最小质数,所以先打印出来
for (prim=3; prim <=100; prim++)//质数
{
for (count=2; count < prim; count++)//用于统计循环次数,除数
{

if (prim % count == 0)
{
cix = true;
break;
}
else
{ cix = false;

}
}
if (cix==false )
Console.WriteLine("prim={0}", prim);
}
Console.Read();
}
}
}


我采用的方法是:2是最小的质数,那么先打印出来。然后在循环体内计算质数,思路是用n(代表一个数)去除以2至n-1,只要有一个能除尽,那么就不是质数。
...全文
11110 38 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
Allyn_0522 2020-12-06
  • 打赏
  • 举报
回复
暖一杯茶-- 2020-05-28
  • 打赏
  • 举报
回复
int a = 100;
Console.WriteLine("质数为:2" );
Console.WriteLine("质数为:3");
Console.WriteLine("质数为:5");
for (int i = 3; i < a; i++)
{
if (i % 5 != 0 && i % 2 != 0 && i % 3 != 0)
{
Console.WriteLine("质数为:" + i);
}
}
Console.ReadKey();
.熬粥 2019-12-05
  • 打赏
  • 举报
回复
int i, j;
for (i = 2; i < 100; i++)
{
for (j = 2; j < (i / j); j++)
if ((i % j) == 0) break;
if (j > (i / j))

Console.WriteLine("{0} 是质数", i);
}
Console.ReadLine();
bbjhn 2019-07-30
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
bool isPrime(int x) {
if(x<=1)return 0;
for(int i=2;i*i<=x;i++)
if(x%i==0)return 0;
return 1;
}
int main() {
for(int i=1;i<=100;i++)
if(isPrime(i))
cout<<i<<" ";
return 0;
}

flybirding10011 2019-02-25
  • 打赏
  • 举报
回复
MYsce 2019-02-20
  • 打赏
  • 举报
回复
MYsce 2019-02-20
  • 打赏
  • 举报
回复
MYsce 2019-02-20
  • 打赏
  • 举报
回复


射手座cl 2019-02-18
  • 打赏
  • 举报
回复
引用 14 楼 desperaso 的回复:
public static bool IsPrime(int i)
{
return !Regex.IsMatch(new string('*', i), "^.?$|^(..+?)\\1+$");
}


引用链接英文
引用
https://geelaw.blog/entries/regex-prime-js-benchmark/

中文(见评论)
引用
https://github.com/jawil/blog/issues/20

下面是大神对这个正则式的评论
您首先要意识到的是,判断质数属于 P,用正则表达式的方法是 指数级别 的算法,即使不用那个 高明 的 P 算法,也可以用 sqrt(N) 的方法,同样比正则表达式具有更优的 渐近时间复杂度。

其次,您的实现是不公平的,正则表达式版本缺少对 num 的检验,循环的版本里面开方会面临浮点误差的问题。对于开方的问题,一种常见的实现是换成 i*i<=x(实践上性能也更好),另一种是把开方结果四舍五入。

最后,您测量时间的 方法是错误的,因为:

您忘了考虑第一次 JIT 时间混进来;
您并没有测试多次取平均数(当然这里也要小心编译器发现这些函数是纯粹的,从而优化掉);
您的数据很糟糕——123456 具有一个非常非常小的质因子。

我重新写了一份代码。先贴结果,我的环境是 NodeJS 6.10.3,多次运行结果接近这种排序:

isPrimeSqrtN(19): 0.154ms
isPrimeRegex(19): 0.161ms
isPrimeSqrtN(123456): 0.460ms
isPrimeRegex(123456): 2.868ms
isPrimeSqrtN(347*347): 0.581ms
isPrimeRegex(347*347): 30.239ms

测试的命令是 node <file.js> 2> nul,测试的代码是(347 是一个质数):

function isPrimeSqrtN(x)
{
if (x < 2) return false;
for (var i = 2; i * i <= x; ++i)
if (x % i == 0)
return false;
return true;
}
function isPrimeRegex(x)
{
return !/^1?$|^(11+?)\1+$/.test(Array(x+1).join('1'));
}

console.error(isPrimeSqrtN(9));
console.error(isPrimeSqrtN(7));
console.error(isPrimeRegex(9));
console.error(isPrimeRegex(7));

console.time('isPrimeSqrtN(19)');
console.error(isPrimeSqrtN(19));
console.timeEnd('isPrimeSqrtN(19)');
console.time('isPrimeRegex(19)');
console.error(isPrimeRegex(19));
console.timeEnd('isPrimeRegex(19)');

console.time('isPrimeSqrtN(123456)');
console.error(isPrimeSqrtN(123456));
console.timeEnd('isPrimeSqrtN(123456)');
console.time('isPrimeRegex(123456)');
console.error(isPrimeRegex(123456));
console.timeEnd('isPrimeRegex(123456)');

console.time('isPrimeSqrtN(347*347)');
console.error(isPrimeSqrtN(347*347));
console.timeEnd('isPrimeSqrtN(347*347)');
console.time('isPrimeRegex(347*347)');
console.error(isPrimeRegex(347*347));
console.timeEnd('isPrimeRegex(347*347)');

  • 打赏
  • 举报
回复
有些优化是否真的值得,其实还是要用测试来验证。例如
筛[i] = true;
改为
if(!筛[i])
    筛[i]=true;
这类操作。 所以对于不太明显的所谓“优化”,对于那些可读性不好的所谓算法,其实可以先不使用。
  • 打赏
  • 举报
回复
引用 30 楼 砸死牛顿的苹果 的回复:
还有用筛法 不过100以内效率差不多
最好写一个测试程序,贴结果数据。
JK Chen 2019-02-17
  • 打赏
  • 举报
回复
#include"cstdio" #include"cstring" using namespace std; #define MAX 100000//求MAX范围内的素数 long long su[MAX],cnt; bool isprime[MAX]; void prime() { cnt=1; memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数 isprime[0]=isprime[1]=0;//0和1不是素数 for(long long i=2;i<=MAX;i++) { if(isprime[i]) su[cnt++]=i;//保存素数i for(long long j=1;j<cnt&&su[j]*i<MAX;j++) { isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数 } } } int main() { prime(); for(long long i=1;i<cnt;i++) printf("%d ",su[i]); return 0; }
JK Chen 2019-02-17
  • 打赏
  • 举报
回复
素数筛,O(n)算法,最快的吧
Yzhe 2019-02-17
  • 打赏
  • 举报
回复
欧拉线性筛了解一下
姈熙 2019-02-17
  • 打赏
  • 举报
回复
vc++,我来试试

#include <stdio.h>
#include<math.h>
int main()
{
int k,i,j;
for(i=2;i<=100;i++)
{ k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0) break;
if(j>k) printf("%d\n",i);
}
return 0;
}
programerjack 2019-02-17
  • 打赏
  • 举报
回复
学习,只要从2到max/2就行
  • 打赏
  • 举报
回复
还有用筛法 不过100以内效率差不多
  • 打赏
  • 举报
回复
楼上范围错了
for (i = 2, j = 3; i <= 100; i = j += 2)
  • 打赏
  • 举报
回复
for (i = 2, j = 3; i <= sqrt(100); i = j += 2)
threenewbee 2019-02-16
  • 打赏
  • 举报
回复
引用 6 楼 liusa1997 的回复:
[quote=引用 5 楼 caozhy 的回复:] [quote=引用 3 楼 胖叔叔写代码 的回复:] 你们俩都可以改进一点,所有2结尾的数字都能被2整除,因此第一个循环直接i+2,不再循环偶数即可。
我的代码也有你说的问题吗。求教。谢谢。[/quote] 他说的是偶数都不可能是质数(2除外)所以没必要判断除2以外的偶数,只判断奇数。for (int i = 2; i <= n; i++)改为for (int i = 2,int j=1; i <= n; i=2*(++j)-1)循环次数就降低了[/quote] 懂了
加载更多回复(18)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧