-(数的分解)

来源:互联网 发布:windows转换苹果系统 编辑:程序博客网 时间:2024/05/29 02:00



这个题做了这么多次是因为真没想到用这么水的方法过了,还以为跟筛素数一样有关联处理。。。其实直接暴力就好了,而且找不到原题不方便复制文字,只好贴图。

代码:

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>#include<cstring>#include<map>using namespace std;#define M 1000005typedef long long ll;int n,c;int num[M]; //num[i]是代表数字i可以分解为几个质因数bool vis[M]; //vis[i]=false说明i为素数int prime[M];//记录素数int ans[M]; //记录结果void init() //筛素数{    int m=sqrt(1000000+0.5);    int i,j;    c=0;    for(i=2;i<=m;i++)    {        if(!vis[i])        {            prime[c++]=i;            for(j=i*i;j<=1000000;j+=i)            {                vis[j]=true;            }        }    }}void work() //求num[i]{    int i,j,temp;    for(i=2;i<=1000000;i++)    {         if(!vis[i]) //如果是素数,那么它只有一个因数        {            num[i]=1;            continue;        }        temp=i;        for(j=0;j<c;j++)        {            while(temp%prime[j]==0) //temp是pirme[j]的倍数,则将这个因子去除            {                num[i]++;                temp=temp/prime[j];            }        }        if(temp!=1) //如果有剩余因子            num[i]++;    }}int main(){    init();    work();    int i;    for(i=1;i<=1000000;i++)    {        ans[i]=ans[i-1]+num[i];    }    while(scanf("%d",&n)!=EOF)    {        printf("%d\n",ans[n]);    }    return 0;}


原创粉丝点击