分解素因数 九度1207 1104 1087

九度OJ 1207 质因数的个数 (筛素数,勉强AC)


题目描述:

求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:

可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。

输出:

对于每组数据,输出N的质因数的个数。

样例输入:
120
样例输出:
5
提示:

注意:1不是N的质因数;若N为质数,N是N的质因数。

来源:
2007年清华大学计算机研究生机试真题

若测试完2到100000内所有素因数都没有分解到1则a还有一个大于100000的素因数   
#include <iostream>
#include<stdio.h>
#include<math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int prime[100001];
int primesize;
bool mark[100001];
void init()
{
primesize=0;
int bound=(int)sqrt(pow(10,9))+1; 
for(int i=2;i<bound;i++)
{
mark[i]=true;
}
for(int i=2;i<=bound;i++)
{
if(mark[i]==false)continue;
prime[primesize++]=i;
for(int j=i*i;j<=bound;j+=i)
{
mark[j]=false;
}
}
}
int main(int argc, char** argv) {
int n;
init();

while(scanf("%d",&n)!=EOF)
{
int ansnum[99999];
int anssize=0;
int ansprime[99999];


for(int i=0;i<primesize;i++)
{
if(n%prime[i]==0)
{
ansnum[anssize]=0;
ansprime[anssize]=prime[i];
}
while(n%prime[i]==0)
{
ansnum[anssize]++;
n/=prime[i];
}
anssize++;
if(n==1)break;
}
if(n!=1)
{
ansnum[anssize]=1;
ansprime[anssize++]=n;
}
int ans=0;
for(int i=0;i<anssize;i++)
{
ans+=ansnum[i];
}
printf("%d\n",ans);
}
return 0;
}
这题测试的用例真太大了,我测试了好多次都是通不过,最后发现原来数组没给够。。。10亿!!!

九度OJ 1104 整除问题

题目描述:

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

输入:

两个整数n(2<=n<=1000),a(2<=a<=1000)

输出:

一个整数.

样例输入:
6 10
样例输出:
1
哎呀这题好难
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
int prime[1010];
int primesize;
bool mark[1010];
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void init()
{
int bound=(int)sqrt(1000)+1;
for(int i=2;i<=bound;i++)
{
mark[i]=true;
}
for(int i=2;i<=bound;i++)
{
if(mark[i]==false)continue;
prime[primesize++]=i;
for(int j=i*i;j<=bound;j+=i)
{
mark[j]=false;
}
}
}
int cnt[1010];
int cnt2[1010];


int main(int argc, char** argv) {
int n,a;
init();
while(scanf("%d%d",&n,&a)==2)
{
for(int i=0;i<primesize;i++)
{
cnt[i]=cnt2[i]=0;
}
for(int i=0;i<primesize;i++)
{
{
int t=n/prime[i];
while(t)
{
cnt[i]+=t;
t/=prime[i];
}
}
}
int ans=99999999;
for(int i=0;i<primesize;i++)
{
while(a%prime[i]==0)
{
cnt2[i]++;
a/=prime[i];
}
if(cnt2[i]==0)continue;
if(cnt[i]/cnt2[i]<ans)
{
ans=cnt[i]/cnt2[i];
}
}
printf("%d\n",ans);

return 0;
}

九度OJ 1087 约数的个数


题目描述:

输入n个整数,依次输出每个数的约数的个数

输入:

输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。

输出:

可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。

样例输入:
5
1 3 4 6 12
样例输出:
1
2
3
4
6

1.约数个数定理:对于一个数a可以分解质因数:a=a1的r1次方乘以a2的r2次方乘以a3的r3次方乘以……

则a的约数的个数就是(r1+1)(r2+1)(r3+1)……

需要指出来的是,a1,a2,a3……都是a的质因数。r1,r2,r3……是a1,a2,a3……的指数。

百度的:


约数个数定理

编辑
对于一个大于1正整数n可以 分解质因数
 
则n的 正约数的个数就是
   
其中a 1、a 2、a 3…a k是p 1、p 2、p 3,…p k的指数。

定理简证

编辑
首先同上,n可以 分解质因数:n=p1^a1×p2^a2×p3^a3*…*pk^ak,
由约数定义可知p1^a1的约数有:p1^0, p1^1, p1^2......p1^a1 ,共(a1+1)个;同理p2^a2的 约数有(a2+1)个......pk^ak的约数有(ak+1)个。
故根据 乘法原理:n的约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值