九度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的质因数。
若测试完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;
}
#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;
}
#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可以
分解质因数:
![](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D231/sign=e19b382db04543a9f11bfdcf2f168a7b/a8ec8a13632762d0a5814266a7ec08fa503dc6a8.jpg)
则n的
正约数的个数就是
。
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D316/sign=ca4b36d4d243ad4ba22e40c1b4035a89/8ad4b31c8701a18b94aed93e9d2f07082838fe7e.jpg)
其中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)。