直接计数就可为什么这题通过率可以这么低???

更多PAT甲级题解---acking-you.github.io

题目

OJ平台

题目详解

直接看例子就知道了,就是把N进行质因数分解,然后注意的是有多个相同的质因数时需要把它们以指数形式输出。

  • 感觉算是入门的的水题了,咋通过率这么低。。。。

代码详解

记录质因数次数的方式

  1. 用哈希表的形式进行记录(也可用数组进行记录,此处用了STL的散列表)
unordered_map<int, int> cnt;    //记录质因数的次数
vector<int> num;                //记录所有质因数
  1. 同时将指数和次数形成映射(实际用之前的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;
}