直接计数就可为什么这题通过率可以这么低???
更多PAT甲级题解---acking-you.github.io
题目
题目详解
直接看例子就知道了,就是把N进行质因数分解,然后注意的是有多个相同的质因数时需要把它们以指数形式输出。
- 感觉算是入门的的水题了,咋通过率这么低。。。。
代码详解
记录质因数次数的方式
- 用哈希表的形式进行记录(也可用数组进行记录,此处用了STL的散列表)
unordered_map<int, int> cnt; //记录质因数的次数
vector<int> num; //记录所有质因数
- 同时将指数和次数形成映射(实际用之前的STL的哈希表就能实现)
当然你也可以用自己的结构体实现相应的映射。 此时为保证输出有序,应使用map而不是unordered版本。
map<int, int> cnt; //记录质因数和次数的映射关系
预处理过程--判断质数和更新数据
bool isPrime(long x) {
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
void solve() {
ios::sync_with_stdio(false);
cin >> N;
cout << N << "=";
if (isPrime(N)) {
cout << N;
return;
}
int t = N;
for (int i = 2; i <= N; i++) {
if (t % i == 0) {
while (t % i == 0) {
cnt[i]++;
t /= i;
}
}
if (t == 1) {
break;
}
}
}
输出过程处理--将每个元素看作单独处理
void handle_one(int a) { //处理单个元素的打印
cout << a;
switch (cnt[a]) {
case 1:
break;
default:
cout << '^' << cnt[a];
}
}
void print() {
if (cnt.empty())
return;
for (auto it = cnt.begin(); it != cnt.end(); ) {
handle_one(it->first);
it++;
if (it != cnt.end())
cout << "*";
}
}
代码提交
两者的效率都差不多,想要进一步提高效率,还是得用原生数组,或者是直接记录。
#include<bits/stdc++.h>
using namespace std;
long N;
map<int, int> cnt; //记录质因数和次数的映射关系
bool isPrime(long x) {
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
void solve() {
ios::sync_with_stdio(false);
cin >> N;
cout << N << "=";
if (isPrime(N)) {
cout << N;
return;
}
int t = N;
for (int i = 2; i <= N; i++) {
if (t % i == 0) {
while (t % i == 0) {
cnt[i]++;
t /= i;
}
}
if (t == 1) {
break;
}
}
}
void handle_one(int a) { //处理单个元素的打印
cout << a;
switch (cnt[a]) {
case 1:
break;
default:
cout << '^' << cnt[a];
}
}
void print() {
if (cnt.empty())
return;
for (auto it = cnt.begin(); it != cnt.end(); ) {
handle_one(it->first);
it++;
if (it != cnt.end())
cout << "*";
}
}
int main() {
solve();
print();
return 0;
}