上交oj4039遇到小困难
题目见https://acm.sjtu.edu.cn/OnlineJudge/problem/4039
代码:
#include<cstdio> int main() { unsigned int n; int count=0; scanf("%d",&n); for(int i=2;i*i<=n;i++) { if(n%i==0) count++; } if(count==0) printf("%d",n); else { for(int i=2;i<=n;i++) { while(n!=i) { if(n%i==0) { printf("%d ",i); n=n/i;} else break; } } printf("%d",n); } return 0; }
其中
else { for(int i=2;i<=n;i++) { while(n!=i) { if(n%i==0) { printf("%d ",i); n=n/i;} else break; } } printf("%d",n); }
这一部分是从https://www.cnblogs.com/youxin/p/3232049.html上找到的,叫Pollard Rho因数分解算法,其过程为:
分解质因数代码:
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,
重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
代码中i即为算法中的k,因为题目让每个因数之间空格,最后一个后面没有空格,与此算法得到的结果恰好吻合,故猜测出题人就是为了考此算法.