P1619 解一元二次方程的烦恼题解
Posted begin-ac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1619 解一元二次方程的烦恼题解相关的知识,希望对你有一定的参考价值。
传送门:P1619
这道题题面比较长,但是作为一道模拟题还是又短又简单的你看看隔壁猪国杀蚂蚁。它的处理过程大致分为以下几步:
1.输入字符串,提取数字
2.质性判断
3.大小判断
4.分解质因数
5.返回第一步
明确了模拟过程后,我们开始逐一分析每步应该做的事情。
过程一:输入字符串,提取数字。 提取数字其实并不是什么难事,只需要将快速读入的代码改造一下就可以在这里使用不会快速读入?请左转百度。需要注意的是,平常的快速读入是逐字符进行读入,但在这里由于行内存在空格,建议直接读入一整行。具体细节见下代码。
puts("Enter the number=");//题目中虽然说要先读入在换行,但是实测这里直接puts没有任何问题,应该是洛谷评测的一个feature。 n = 0;//用来存储输入的数字 string a; getline(cin, a); //这里不建议使用字符数组,因为scanf遇到空格会停止,而且gets已经spfa了(雾) for (int i = 0; i < a.size(); i++)//遍历字符串 if (a[i] >= ‘0‘ && a[i] <= ‘9‘)//如果这一位是数字,就存起来 n *= 10; n += a[i] - ‘0‘;
过程二:质性判断
这里直接对 n 的质性进行判断即可。不会判断质数请右转P3383线性筛素数
bool judge(int n) int m = (int) sqrt(n + 0.5);//循环上界 for (int i = 2; i <= m; i++) if (n % i == 0) return false; return true; //正常的判断函数
过程三:判断大小
这一过程可以拆成两部分完成。第一部分判断是否小于二放在质性判断之前(由于数据保证数字 n 为正数,所以 n<2⇔n 不是质数)。第二部分判断是否大于四千万放在质性判断之后。注意输出格式即可。
过程四:分解质因数
这里是整个代码中最长的一段,主要是为了处理它的输出。显然,输出时第一个质因数和其余质因数有不同,即其前面没有*号。因此,在输出时需要对第一个质因数进行特判。
cout<<n<<‘=‘; bool first = true;//用于判断当前数是否为质数 for (int i = 2; i <= n; i++) int k = 0; while (n % i == 0) k++; n /= i; //对n进行质因数分解 if (k)//如果i是n的质因数 if (first) cout<<i<<‘^‘<<k;//第一个质因数前没有*号 first = false; else cout<<‘*‘<<i<<‘^‘<<k; cout<<endl;//注意此处应该有换行
过程五:返回第一步
这里有多种方法返回。在这里我采用在整个主函数中套一个大大的while(ture)
并在检查到不合法数据时及时return 0;
来结束主函数的方法。
处理完这一步,这道模(du)拟(liu)就被我们解决了。最后惯例放上完整代码。
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define int long long using namespace std; bool judge(int n) int m = (int) sqrt(n + 0.5); for (int i = 2; i <= m; i++) if (n % i == 0) return false; return true; signed main() int n; while (true) puts("Enter the number="); n = 0; string a; getline(cin, a); for (int i = 0; i < a.size(); i++) if(a[i] >= ‘0‘ && a[i] <= ‘9‘) n *= 10; n += a[i] - ‘0‘; if (n == 0) return 0; cout<<"Prime? "; if (n < 2) puts("No!"); else if ( !judge(n) ) puts("No!"); if (n > 40000000) puts("The number is too large!\n"); continue; cout<<n<<‘=‘; bool first = true; for (int i = 2; i <= n; i++) int k = 0; while ( !(n % i) ) k++; n /= i; if (k) if (first) cout<<i<<‘^‘<<k; first = false; else cout<<‘*‘<<i<<‘^‘<<k; cout<<endl; else puts("Yes!"); cout<<endl;
以上是关于P1619 解一元二次方程的烦恼题解的主要内容,如果未能解决你的问题,请参考以下文章