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");
}
}
}

浙公网安备 33010602011771号