首页 > 试题广场 >

以下代码是用来计算100以内的素数的个数,请把相应的空填上。

[填空题]
以下代码是用来计算100以内的素数的个数,请把相应的空填上。
struct prime_number_node
{
int prime_number;
prime_number_node *next;
};
int calc_prime_number( )
{
prime_number_node *list_head = new prime_number_node( );
list_head - > next = NULL;
list_head - > prime_number = 2;
prime_number_node *list_tail = list_head;
for (int number = 3 ; number < 100 ; number++)
{
int remainder;
prime_number_node *cur_node_ptr = list_head;
while (cur_node_ptr != NULL)
{
remainder = number % cur_node_ptr - >
prime_number;
if (remainder == 0)
{
1//1
}
else
{
2//2
}
}
if (remainder != 0)
{
prime_number_node *new_node_ptr = new prime_number_node( );
new_node_ptr - > prime_number = number;
new_node_ptr - > next = NULL;
list_tail - > next = new_node_ptr;
3//3
}
}
int result = 0;
while (list_head != NULL)
{
result++;
prime_number_node *temp_ptr = list_head;
list_head = list_head - >
next;
4//4
}
return result;
}
推荐
1  break;
2  cur_node_ptr = cur_node_ptr->next;
3  list_tail = list_tail->next;
4  delete temp_ptr;

编辑于 2015-02-09 09:56:02 回复(12)
算法思想:
任何整数n≥2都可以分解成若干质数(素数)的乘积,即
n=p1  × p2  × ···  × pr; 且这些质数的组成是唯一的.
在我们开始证明计算基本定理之前,先要做一些必要的解释.首先,如果n本身就是个质数,那么我们只能写成n=n,并且把它认定成一个独立数字的乘积.第二,当我们写出n=p1p2···pr时,并不意味着p1,p2,...,pr这些数都是不同的质数.比如,300=2×2×3×5×5.第三,所说的那个“唯一”指的是那些质数的组成是唯一的,而不是指排列顺序.如,12=2×2×3,12=2×3×2,12=3×2×2,但这些都视为同一种组成方式.
所以判断一正整数是不是素数,只要用该数对其之前的所有素数进行求余运算,余数为零,说明该数包含除了1和其本身之外的其他因数,不可能是素数,否则的话,该数就是素数。
所以程序中,对于每一个需要判定的数number,在for循环开始之前,cur_node_ptr指针都会被拉到链表的头指针处,之后用链表中已经存在的,比number要小的这些素数,一个一个的去除number,看number中是否包含链表中已经存在的素数,,没有,该数就是素数!!
发表于 2015-09-16 10:51:13 回复(1)
懂了此题的算法,这题就算解决了,算法是:若正整数n>1,且n不能被小于n(或者n的平方根)的任一素数整除,则n是素数。
发表于 2016-01-23 22:00:17 回复(0)
第3空,另一种写法:list_tail = new_node_ptr也是对的吧
发表于 2016-08-28 15:18:13 回复(1)
等号之间没有空格也算错。。。。
发表于 2016-07-21 22:02:49 回复(0)
这种题只能做字符串比较,写对的也判错或者等效写法也判错;希望判别机制能有所改进
发表于 2016-06-25 17:29:56 回复(0)
list_tail = new_node_ptr;和  list_tail = list_tail->next;有区别吗?
发表于 2016-04-21 15:05:56 回复(0)
 for (int number = 3 ; number & lt; 100 ; number++)  这里面三个分号是什么意思
发表于 2015-11-24 15:28:32 回复(1)
答案判断他喵的太不智能了!
发表于 2015-09-08 23:57:58 回复(1)
为什么错了呢?
发表于 2017-07-11 10:17:09 回复(0)
MMP TAT
发表于 2017-07-10 16:42:11 回复(0)
第3空 使用 list_tail = new_node_ptr;
第四空 使用free+置空指令都是报错。。。
发表于 2017-05-16 23:27:33 回复(0)
最后一步释放内存
发表于 2016-09-07 07:27:15 回复(0)
 记得分配内存后,一定要释放相应内存。

发表于 2016-05-20 21:00:33 回复(0)
提出三个问题,希望有人解答。
1.第一个while(cur_node_ptr != NULL) 中,cur_node_ptr从list_head指向的链表开始,可是这个链表并没有自身增长语句?
2.第三空 可以写成 " list_tail=new_node_ptr; " 吧?
3.第四空 意思在哪里?
编辑于 2015-12-30 15:10:04 回复(1)
  prime_number_node *temp_ptr = list_head;
        list_head = list_head - >
        next;
         4  //4

声明这个temp_ptr 干嘛的??

发表于 2015-11-15 00:03:54 回复(1)
(3)list_tail=new_node_ptr; 这个也可以
发表于 2015-11-02 23:33:15 回复(0)
prime_number_node *temp_ptr = list_head;  
表示完全不明白这句的用意 = =
发表于 2015-09-03 22:02:02 回复(2)
手机端题目显示不全啊,无语了
发表于 2015-08-25 17:39:43 回复(0)
我真是服了,牛客网能不能改善一下答案判断?!

cur_node_ptr=cur_node_ptr->next; 错误! 

正确答案: cur_node_ptr = cur_node_ptr->next;

亲!对不起你少了两个空格呢。

(╯‵□′)╯︵┻━┻
编辑于 2015-08-22 15:53:53 回复(1)