前言
操作系统:Fedora
要求:编写一个程序,实现这样的功能:搜索2~65535之间所有的素数并将其保存到数组中,用户输入^C信号时,程序打印出最近找到的素数。
本文为作者班级作业,同班同学参考借鉴的话,别直接拿本文的截图和代码交差啊 : )
代码
sigdemo.c 文件代码如下
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
int i=1,a[30000],j=0;
void sigHandler(int signalNum){
printf("最近找到的素数:%d\n",a[j-1]);
}
int isPrime(int n){ //判断n是否是素数
if( n==1 ) return 0;
if( n!=2&&n%2==0 ) return 0; //排除 除2以外 的偶数,减少计算量
for(int i=3; i*i<=n; i++)
if( n%i == 0) return 0;
return 1;
}
int main(){
signal(SIGINT,sigHandler);
while(i<=65535){
if(isPrime(i)) a[j++]=i;
i++;
usleep(1000);
}
return 0;
}
执行结果
(修改了一个小错误,以下为用 wsl 重新执行的结果)
代码解释
signal()
signal(SIGINT,sigHandler);
当用户输入^C之后,程序并不退出,而是执行 sigHandler()函数,输出最近找到的素数。
usleep()函数
usleep(1)的作用: 休眠 1 微秒,即十的负六次方秒,十的负三次方毫秒
这样可以让找素数的过程慢一点,不至于还没输入 ^C 信号 就把所有素数找完了