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

 

posted @ 2019-08-20 21:21  zs__std  阅读(145)  评论(0编辑  收藏  举报