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<2n 不是质数)。第二部分判断是否大于四千万放在质性判断之后。注意输出格式即可。

过程四:分解质因数

这里是整个代码中最长的一段,主要是为了处理它的输出。显然,输出时第一个质因数和其余质因数有不同,即其前面没有*号。因此,在输出时需要对第一个质因数进行特判。

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 解一元二次方程的烦恼题解的主要内容,如果未能解决你的问题,请参考以下文章

方程的解题解和扩欧的一些总结

C语言求一元二次方程解的函数问题 新手题

NewOJ 题解 [newoj-1250-[蓝桥杯2015初赛]方程整数解] (Python)

二次函数全解

NOIP2012 同余方程 题解

洛谷 P1082 同余方程 题解