质数因子
描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
数据范围
- 输入描述:
输入一个整数。
- 输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
想法思路
证明如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根:
假设n的最小质因数为p;那么一定有n≥p2
另外最多只有一个素因子大于根号n;
若该合数只有2个质因数,即n=p1*p2>(n^0.5)*(n^0.5)=n
ACM应用(确实好用)
在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。
在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几。
下面附上代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for (int i=2; i*i<=n; i++) {
if (n%i==0) {
while (n%i==0) {
cout<<i<<' ';
n /= i;
}
}
}
if (n!=1) cout<<n<<endl;
}