文章

13

粉丝

499

获赞

21

访问

128.4k

头像
[c]看了其它人的算法,我觉得有一个思想需要告诉大家。
P1156 清华大学上机题
发布于2020年4月10日 20:33
阅读数 14.0k

看很多人都是把质数单拎出来,这样其实并不对,因为也会存在很大的质数。所以其中的精髓应该是了解:例如:2和3是一个较小的质数,所以如果每次都从2开始的话,这样子永远求得的都是质数而不会有非质数,因为如果想把4或者6作为因数的话,首先会被先试验的2所分解掉。所以不会出现非质数的情况。

#include<stdio.h>

int main()
{
	int N;
	int step = 0;
	int i = 2;
	while(scanf("%d",&N)!=EOF)
	{
		step = 0;
		if(N==1)
		{
			printf("1\n");
			return 0;
		}
		while(N!=1)
		{
			if(N%i==0)
			{
				step++;
				N = N/i;
				i = 2;
			}
			else
				i++;
		}
		printf("%d\n",step);
	}
	return 0;
}

 

登录查看完整内容


登录后发布评论

15 条评论
寂寞圣哲 VIP
2020年4月16日 11:29

楼主的方法还是很容易让人理解的,值得点赞

赞(0)
admin SVIP
2020年4月16日 10:12

判断到根号下就可以了,加个if就不是暴力了,在这个代码的基础上加一个判断就可以了laughhttp://www.noobdream.com/DreamJudge/Issue/code/84288/

赞(0)

寂寞圣哲 : 回复 admin: OK

2020年4月16日 11:31

寂寞圣哲 : 回复 admin: OK

2020年4月16日 11:31

Lucky_Bug : 回复 admin: 被你说的,我都想删掉这个解答了-。-

2020年4月16日 19:52

admin : 回复 Lucky_Bug: ^_^大家都是通过不断积累提高的

2020年4月17日 23:03
寂寞圣哲 VIP
2020年4月15日 23:33

你这个方法会超时的,我在牛客网上运行了一下,运行超时。例如17,只有一个分解17,但是要从2开始不断加到17,去依次判断,题目中给的

N最大为10^9,肯定会存在一个无限大的素数,这时i要从2一直加到这个数,这样肯定会超时。超时原因是我觉得是这个,可能想的也不对哈

赞(0)

Lucky_Bug : 回复 寂寞圣哲: 你的想法是对的,这种算是一种暴力算法。解决一些简单的题目还行,复杂的还是书上那种比较巧妙。

2020年4月16日 09:31

admin : 回复 寂寞圣哲: 循环里加个小优化就可以了if (i > sqrt(N)) break;,楼主思路是好的,就是代码能力有点尴尬,2333~

2020年4月16日 10:06

admin : 回复 寂寞圣哲: 原来确实没有一个极限素数,没有注意到这种水过去的情况,哈哈,还以为大家都知道判断到sqrt就行了,数据已经加强。

2020年4月16日 10:09

Lucky_Bug : 回复 寂寞圣哲: 一不小心成了反面教材???

2020年4月16日 19:49

寂寞圣哲 : 回复 寂寞圣哲: 啊,我是真心觉得暴力破解很好理解,书上的素数筛选法我还没学会呢,所以没别的意思啊,我自己也是小白一个,哈哈

2020年4月17日 11:52
admin SVIP
2020年4月11日 11:30

给你点32个赞yes

赞(0)

Lucky_Bug : 回复 admin: 是否考虑给我加个热心小朋友的认证??让我涨涨rating值。

2020年4月11日 16:13

admin : 回复 admin: 2333~热心小朋友,打比赛就可以涨rating哦

2020年4月11日 16:49