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