一切问题都是有来源的,所以我直接先上一波题:
正常的从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,就可以很好的解决这个问题。
在最后,再次感谢老铁们的阅读!
欢迎老铁们来点赞与评论 同时也希望老铁们可以指点与纠错,谢谢大家了!