喵喵的数学难题(分解质因子)

3281: 喵喵的数学难题

时间限制: 1 Sec  内存限制: 128 MB
提交: 45  解决: 15
[提交][状态][讨论版][命题人:acm4302]

题目描述

最近,喵喵一直在学习数学。他发现了,任意一个正整数N,都可以被一素数整除。 
发现了这个结论的他特别高兴。有一天,lls给了喵喵一个数字N,
一本正经地告诉他:“你能求所有能整除N!的素数和其相应的数量吗?” 
喵喵想了想说:“直接算不就好了嘛~” 
lls笑了笑说:“小老弟你还是太年轻~” 
你能帮助喵喵顺利求解这个问题吗?

输入

一个整数N (1≤N≤10^5)

输出

所有能整除N!的素数和其数量,共若干行,每行一对pi, ni,按照pi从小到大的顺序输出。 

样例输入

5

样例输出

2 3
3 1
5 1
#include <iostream>
#include <cmath>
using namespace std;

typedef long long ll;

int a[100005]={0};

void fac(int n)
{    //int x=n;
    for(int i=2;i*i<=n;i++) //至于这为什么写 i*i<n,讲解在下方
    {
        while(n%i==0)
        {
            a[i]++;
            n=n/i;
        }
    }
     if(n>1) a[n]++;

}

int main()
{
   int n;
   cin >>n;

   for(int i=2;i<=n;i++)
       fac(i);
   for(int i=2;i<=n;i++)
        if(a[i])
    cout <<i<<" "<<a[i]<<endl;


}

对于上边为什么 i*i<=n ;

举个例子 :48=2*2*2*2*3  和 192=2*2*2*2*3*4

当 48 不断在while中循环时,arr[2]不断加一,到了只剩下3的时候退出while 循环,此时 n=3 ,i=3,里边只包含1 个3,利用下边的

if()判断语句就能再arr[3]++;

而192就不同了,当n里边不在含有质数2时,退出while()循环,此时n=12=3*4=3*(3+1),i=3;显而易见,n中还有2个3,可以进入循环;

             

猜你喜欢

转载自blog.csdn.net/qq_41199502/article/details/82347735