传送门: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;
}
}