2016年5月10日 星期二

UVA 160 : Factors and Factorials

Q160: Factors and Factorials

階乘的數學表示式是 N!, 代表從 1 乘到 N 的結果, 如下:
1! = 1
N! = N * (N-1)!
階乘的成長速度相當驚人, 5! = 120, 10! = 3,628,800, 而表示階乘的其中一種方法是去紀錄每一個質因數出現的頻率。例如 825 這個值, 可以用數字序列 (0 1 2 0 1), 來表示 0 個 2, 1 個 3, 2 個 5, 0 個 7, 1 個 11。
所以數字序列中的每個元素是代表連續出現的質因數, 而上面的數值, 代表該質因數出現的頻率。

寫一個程式讀入一個數字 N (2<=N<=100), 算出階乘結果,以之前的方式來表示這個階乘。
Input
輸入有許多筆測試資料, 一筆一列, 每一列包含一個數字 N, 當 N=0 代表輸入結束, 這一列不該被處理。
Output
每一筆測試資料, 需要輸出一組區塊結果, 這組區塊, 先輸出 N! = , 接下來以上述的方式, 依序輸出該質因數在這個階乘中出現的頻率次數為何(長度3,靠右對齊), 請注意, 每一列最多只能印出 15 個質因數, 多餘的得換一列再印出。

詳細 輸出格式請參考 Sample Output。
Sample InputSample Output
5
53
0
  5! =  3  1  1
 53! = 49 23 12  8  4  4  3  2  2  1  1  1  1  1  1
        1
Translated by Tino



http://luckycat.kshs.kh.edu.tw/homework/q160.htm
http://using-c.blogspot.tw/2008/02/p160-factors-and-factorials.html


import java.util.Scanner;
public class UVA_160 {

public static void main(String[] args) {
int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,
   43,47,53,59,61,67,71,73,79,83,89,97};
Scanner sc=new Scanner(System.in);
int n;
int[][] primeTable=new int[101][25];
   for(int i=2;i<=100;i++){
    int k=i;                                    //2!~100!
    int j=0;                                   //prime[j]開始
    while(k>=2){                         //小於最小質數2就結束
    if(k%prime[j]==0){
    primeTable[i][j]++;     
    k/=prime[j];            //能除的話就一直除
    }else{
    j++;                       //prime[j]質數不能除 所以j+1
    }
    }
   }

while((n=sc.nextInt())!=0){
System.out.print(n+"! = ");
int line=0;
for(int i=0;i<25;i++){
int total=0;
for(int j=0;j<=n;j++){
total+=primeTable[j][i];                 //把所有的prime[j]都加起來
}
if(total!=0){
System.out.print(total+" ");
line++;
}
if(line%15==0)
System.out.println();
}
}
}
}

最後的排版不知道有沒有問題


1 則留言: