1. 程式人生 > >patA1059 Prime Factors

patA1059 Prime Factors

lse names n) 改變 while con sin 結構體數組 cst

這個問題叫做質因子分解,花了大概兩個小時寫對了。這道題細節挺多的,書上提到了幾點,有一個很容易錯的點就是n一開始要先用一個變量保存起來,不保存的話後面有點麻煩,所以建議還是先保存起來。因為過程中要不斷的改變n,最後還要打印出n,如果n為1的話還要特殊處理。當然也可以一開始處理打印,不過我覺得和思維顛倒有些難受。一個很重要的問題就是打印的素數表需要多大,這個我也不清楚怎麽辦,所以先寫出來看,隨機應變,如果不能完全覆蓋的話再往上加,最後完全覆蓋了那個樣例。最後解決的細節是當我輸入2的時候一開始只探測到根號2導致問題沒有解。其實根本沒必要,因為有break來控制著for循環的結束條件。所以i<num的所有數字都正常輸出就好。

一個很重要的思想就是設計結構體以及結構體數組,這個思想還是挺重要的。

#include<cstdio>
#include<math.h>
const int maxn = 19999900;
using namespace std;
struct factor
{
    int x;
    int cnt = 0;
}fac[10];
int num = 0;
bool p[10005] = { 0 };
int prime[100005];
void findprime()//獲取素數表
{
    int i, j;
    for (i = 2; i *i< maxn; i++)
    {
        
if (p[i] == false) { prime[num] = i; num++; for (j = i + i; j *j < maxn; j += i) { p[j] = true; } } } } int main() { int n; int temp; scanf("%d", &n); temp = n; findprime();
int i; int sum = 0; for (i = 0; i<num; i++) { int x = n; while (n % prime[i] == 0) { n /= prime[i]; fac[sum].x = prime[i]; fac[sum].cnt++; } if (x%prime[i] == 0) { sum++; } if (n == 1) break; } if (n != 1) { fac[sum].x = n; fac[sum].cnt = 1; } printf("%d=", temp); if (temp == 1) { printf("1\n"); } else for (i = 0; i < sum; i++) { if (i != sum - 1 && fac[i].cnt > 1)//不是最後一個 { printf("%d^%d*", fac[i].x, fac[i].cnt); } else if (i != sum - 1 && fac[i].cnt == 1) { printf("%d*", fac[i].x); } else if (i == sum - 1 && fac[i].cnt == 1)//是最後一個且cnt只有一個 { printf("%d\n", fac[i].x); } else//最後一個cnt有兩個 printf("%d^%d\n", fac[i].x, fac[i].cnt); } }

patA1059 Prime Factors