分解质因数(优中再优化)

一切问题都是有来源的,所以我直接先上一波题:

正常的从2~n循环,在这里我暂且不谈,直接直入主题(优化 优化)!

接下来我将以代码——>简单分析——>重点谈我遇到的问题,感谢大家的阅读!

#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,tmp,q;
	int j = 0;
	int a[10000] = { 0 };
	scanf("%d", &n);
	tmp = n;
	printf("%d=", n);
	for (i = 2; i <= sqrt(n)+1; i++)//------->1
	{
		if (n % i == 0)
		{
			a[j++] = i;
			n /= i;
			i--;//------>2
		}
		if (i >= sqrt(n))//--------->3
		{
			a[j++] = n;
		}
	}
	for (i = 0; i < j; i++)
	{
		if (i < j - 1)//------->4
			printf("%d*", a[i]);
		else
			printf("%d", a[i]);
	}
	return 0;

注:文章中出现的1~4指 上述代码(数字标号)的位置。

1.sqrt(n)可以很好的优化代码运行速度,如果在sqrt(n)之前(可能)存在该数的质因数;在sqrt(n)后面一定不存在该数的质因数(举个例子 4 = 2*2  ;8 = 2*2*2 ;15 = 3 *5),如果不太理解的话建议百度一下(百度一下 你就知道 狗头保命)。i = sqrt(n)+1,这个+1我最后会重点分析。

2.i--,在这里目的是再进行一次原i的判断(举个例子 8 = 2*2*2)。

3.相当于在一次优化,相当于每次成功处理后,下一次的处理次数(循环)在减少。

4.因为每一次进到if里面都是a[j++],所以到最后一次时j要比我存入的次数大1,在打印的时候-1就OK了。

i = sqrt (n)+1,为什么要加个1?(这也是我一开始发现测试结果不对 进而调试后加上的)

我以一组数据为例,向大家解释一下:

如果没有+1代码运行结果如下:

这就有疑问了,我的19去哪里了?(被吃了吗?)我解释一下:

当代码处理到18468 = 2*2*3*3*3*3*3的时候,我的n=19,sqrt(n)= 4.358899(因为是double类型的),当i=4的时候没有进去,i++=5又跳出for循环,所以导致我最后一个if就有可能进不去(与想象中执行的不一样)。所以在sqrt(n)后面+1,就可以很好的解决这个问题。

在最后,再次感谢老铁们的阅读!

欢迎老铁们来点赞与评论 同时也希望老铁们可以指点与纠错,谢谢大家了!

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joanh_Lan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值