寻找质因子
1:质因子除了2都是偶数,可以先求出2的因子个数,然后再奇数范围内找满足整除的.(不知道为啥,效率有时不高) 2:从两边判断: 如果在<=m/2或是<=sqrt(m)范围内没有找到能整除的则i是素因子。如果i>m/2则m也是素数,m/=i; 代码如下: scanf("%d",&n); while(1) { for(i=2;i<=sqrt(n);i++) if(n%i==0) {is_p[i]++;break;}//is_p存素因子i,的个数 if(i>sqrt(n)) {is_p[n]++;break;} n/=i; }
应用:题目如下:
Description 对于任意一个整数n (n ≥ 2),我们都可以把它拆成几个素数之积,这些素数称为n的素因子,例如20 = 22 × 51,现在给你一个整数n,要求计算n!(表示n的阶乘)的所有的素因子的个数并按升序输出,格式见样例。 Input 包含多组测试实例,每组输入为一个整数n,2 ≤ n ≤ 10000。 Output 输出n!的所有素因子p和它的个数k,每个素因子占一行。
Sample Input 20
Sample Output 2 18 3 8 5 4 7 2 11 1 13 1 17 1 19 1
Hint
题上测试实例可以这样解释:20!= 218 × 38 × 54 ×72 × 111 × 131 × 17 1 × 191
用法1做:Time Limit Exceed 不过、这也是种思路
ac:memory:136k time:125ms
代码
#include<stdio.h>
#include<string.h>
#define N 10001
int main()
{
int n,num[N];
int i,j,temp;
while(scanf("%d",&n)!=EOF)
{
memset(num,0,sizeof(num));
for(i=2;i<=n;i++)
{
temp=i;
while(1)
{
for(j=2;j<=temp/2;j++)
if(temp%j==0){num[j]++;break;}
if(j>temp/2){num[temp]++;break;}
temp/=j;
}
}
for(i=2;i<=n;i++)
if(num[i])printf("%d %d\n",i,num[i]);
}
return 0;
}