天天看點

因子和階乘

給你一個正整數n,把n!=1x2x3x.....xn分解成素因子相乘的形式,并從小到大輸出每個素因子的指數,但要保證最後輸出的素因子個數不為0。例如825應表示為0,1,2,0,1表示分别有0,1,2,0,1個2,3,5,7,11。
輸入

第一行有一個整數n(0<n<10000),表示有n組測試資料;

接下來n行每行有一個整數 m(1<m<10000)

輸出
從小到大輸出m分解成素因子相乘後各個素因子對應的指數
樣例輸入
2
5
53
      
樣例輸出
3 1 1
49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1       
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
int main()
{
    int prime[109]={1,1},cost[25],i,j,n=0,m,t;
    for(i=2;i<=10;i++)
        for(j=i;j*i<=100;j++)
            prime[j*i]=1;
    for(i=2;i<=100;i++)
        if(prime[i]==0)
            cost[n++]=i;
    memset(prime,0,sizeof(prime));
    while(scanf("%d",&m)==1)
    {
        for(i=0;i<25;i++)
            if(cost[i]>m)
                break;
        for(n=2;n<=m;n++)
        {
            t=n;
            //printf("%d\n",n);
            for(j=0;j<i;j++)
            {
                n=t;
               // printf("%d %d\n",n,cost[j]);
                if(n/cost[j]==0)
                    break;
                while(n%cost[j]==0)
                {
                    n=n/cost[j];
                    prime[cost[j]]++;
                }
            }
            n=t;
        }
        for(n=0;n<i;n++)
            printf("%d ",prime[cost[n]]);
        printf("\n");
        memset(prime,0,sizeof(prime));
    }
    return 0;
}
           

繼續閱讀