1. 题目链接
2. 题目代码
#include<iostream>
using namespace std;
int main(){
int testCase;
cin >> testCase;
int primeNumber;
bool isOutput = false;
while(testCase --){
cin >> primeNumber;
// isOutput = false;
// for(int ingeterA = 2; ingeterA <= primeNumber; ingeterA ++){
// for(int ingeterB = ingeterA + 1; ingeterB <= primeNumber; ingeterB ++){
// if(primeNumber % ingeterA == primeNumber % ingeterB){
// cout << ingeterA << " " << ingeterB << endl;
// isOutput = true;
// break;
// }
// }
// if(isOutput){
// break;
// }
// }
cout << 2 << " " << primeNumber - 1 << endl;
}
return 0;
}
3. 题目总结
① 答案错误那个代码是:cout << 2 << " " << (primeNumber - 1) / 2 << endl;
② 当时的想法是:该题点明了“P是大于等于5的素数”,所以P-1一定是偶数。该题只要求"P%a = P % b",因此如果令P%a= P%b=1,那么a、b就等于P-1的两个因数。又因为P-1是偶数,所以可以让a=2,b= (primeNumber - 1) / 2 。
③ 漏洞:忽略了a、b不能相等的情况。P=5时,a、b都等于2.
④ 改进:直接输出 2 和 primeNumber - 1 即可。因为 primeNumber - 1 也是其自身的一个因数。
⑤ 该题耗时:20min
下述代码来源:
值得学习的地方:
ios_base::sync_with_stdio(0);
和cin.tie(0);
是用于加速 C++ 输入输出流的常用技巧,特别是在处理大量输入输出数据时。这些命令主要用于在程序竞赛或性能要求较高的场景下提高效率。
ios_base::sync_with_stdio(0);
:这一行代码用于解同步 C++ 的标准输入输出流和 C 的标准输入输出流。默认情况下,C++ 的标准流(cin
、cout
等)和 C 的标准流(scanf
、printf
等)是同步的。这意味着它们之间会有一些额外的开销,以确保两者的一致性。使用ios_base::sync_with_stdio(false);
时,C++ 标准流和 C 标准流的同步被关闭,这样可以减少一些开销,从而提高性能。
cin.tie(0);
:这一行代码将cin
与cout
解绑定。 默认情况下,cin
是绑定到cout
的,这意味着每次cin
操作前,cout
都会被刷新(flush
)。这通常是为了确保用户在输入时能够看到所有输出。通过使用cin.tie(0);
,你可以解除这种绑定,避免每次输入操作前都刷新输出流,从而提高输入输出操作的效率。