LuoguP1619 解一元二次方程的煩惱 題解
阿新 • • 發佈:2021-12-21
LuoguP1619 解一元二次方程的煩惱 題解
Content
模擬一個系統,給出一個數 \(n\),讓你判斷是否是素數,如果是合數的話就要質因數分解。
需要注意的幾點:
- 數字超過 \(4\times 10^7\),輸出溢位提示。
- 數字小於 \(2\),輸出
No!
之後直接進入下一次操作。 - 數字是合數,則進行質因數分解,分解後的格式為
x=x_1^a_1*x_2^a_2*...
,其中 \(x_i\) 為這個數從小到大第 \(i\) 個質因子,\(a_i\) 為第 \(i\) 個質因子的指數。 - 輸出中會有各種友情提示和換行,請注意每一個細節。
資料範圍:\(n\leqslant 4\times 10^7\)。
Solution
這道題目實質上是不難的,至於為什麼評為藍題,個人認為是這噁心的輸出方式吧。
在這裡給大家總結幾點吧——
- 要在輸出完
Enter the number=
之後換行,不然滿屏都是 \(\texttt{WA}\)。原因是第一行太長。 - 要在每個資料之間空一行,不然也會有大面積的 \(\texttt{WA}\)。原因是在某一行會太長(這也就說明了本題的評測方式是逐行比對,且不忽略多餘的空格、換行和製表符)。
Prime?
之後一定要有一個空格!- 沒有數字直接退出,不需要再輸出多餘的東西。
- 數字溢位,輸出完溢位提示後直接進入下一個操作,不需要再輸出多餘的東西。
- 注意不需要再質因數分解中多出一些空格,諸如
15 = 3 ^ 1 * 5 ^ 1
等。
注意以上這幾點,這道題目就不算難了。
Code
//注意這裡省略了標頭檔案 using namespace std; bool judge(int x) { for(int i = 2; i <= floor(sqrt(x) + 0.5); ++i) if(!(x % i)) return 0; return 1; } void divide(int x) { int flagone = 1; for(int i = 2; i <= x; ++i) if(!(x % i)) { int cimi = 0; while(!(x % i)) { cimi++; x /= i; } if(flagone) flagone = 0; else printf("*"); printf("%d^%d", i, cimi); } } int main() { while(1) { printf("Enter the number=\n"); int num = 0, flag = 0, yichu = 0; string sa; getline(cin, sa); int len = sa.size(); for(int i = 0; i < len; ++i) { if(sa[i] >= '0' && sa[i] <= '9') { flag = 1; num = num * 10 + sa[i] - '0'; } if(num > 40000000) { printf("Prime? No!\nThe number is too large!\n\n"); yichu = 1; break; } } if(!flag) break; if(yichu) continue; printf("Prime? "); if(num < 2) { printf("No!\n\n"); continue; } if(judge(num)) { printf("Yes!\n\n"); continue; } else { printf("No!\n%d=", num); divide(num); puts("\n"); } } }