#27191: Java 超詳細解釋 不對電腦造成負擔的程式碼範例


s10914054@gm.cyut.edu.tw (Justin Tseng)

學校 : 不指定學校
編號 : 167107
來源 : [223.137.177.247]
最後登入時間 :
2022-08-30 17:42:14
a010. 因數分解 | From: [118.170.3.66] | 發表日期 : 2021-09-17 15:42

import java.util.*;

 

public class a010

{

public static int AddValue(int value) //用來增加HashMap中的次數

{

return value+1;

}

public static void main(String[] args)

{

boolean prime;

HashMap<Integer,Integer> primefactor=new HashMap<Integer,Integer>(); //HashMap用法不懂的可以上網查 這次用在"每個因數=出現次數"

 

Scanner sc=new Scanner(System.in);

int number=sc.nextInt();

 

while(number%2==0) //先把2這個質數的因數次數算出來

{

if(primefactor.containsKey(2)) //如果primefactor包含2 就把2的次數+1

primefactor.put(2,AddValue(primefactor.get(2)));

else //如果沒有包含2 則把2放進去(此時次數為1)

primefactor.put(2,1);

number/=2; //每次找到一個因數 number就要/該因數

}

for(int i=3;i<=number;i+=2) //偶數一定不是質數 因此直接從3開始 並且+2跑下去

{

prime=true;

for(int j=3;j<=Math.sqrt(i);j+=2) //根據數學公式 只要跑到根號i即可判斷出是否為質數

if(i%j==0) //發生整除 -> 不是質數

{

prime=false;

break;

}

if(prime)

while(number%i==0) //如果是質數 就一直算出該質因數的次數

{

if(primefactor.containsKey(i)) //如果primefactor包含2 就把2的次數+1

primefactor.put(i,AddValue(primefactor.get(i)));

else //如果沒有包含i 則把i放進去(此時次數為1)

primefactor.put(i,1);

number/=i;

}

if(number==1) //number=1的時候代表質因數都找完了 可以直接退出迴圈

break;

}

 

ArrayList<Integer>sort_map=new ArrayList<Integer>(primefactor.keySet()); //對HashMap做排序

Collections.sort(sort_map);

 

for(int i=0;i<sort_map.size()-1;i++) //輸出質因數

{

if(primefactor.get(sort_map.get(i))==1)

System.out.print(sort_map.get(i)+" * ");

else

System.out.print(sort_map.get(i)+"^"+primefactor.get(sort_map.get(i))+" * ");

}

if(primefactor.get(sort_map.get(sort_map.size()-1))==1) //輸出最後一個質因數 後面不能有'*' 所以做額外處理

System.out.print(sort_map.get(sort_map.size()-1));

else

System.out.print(sort_map.get(sort_map.size()-1)+"^"+primefactor.get(sort_map.get(sort_map.size()-1)));

 

sc.close();

}

}

 
ZeroJudge Forum