#30128: 為甚麼這樣寫會TLE......


10730094@ms2.hssh.tp.edu.tw (給開司一份薯片)

學校 : 不指定學校
編號 : 172670
來源 : [180.177.114.33]
最後登入時間 :
2023-01-01 23:20:42
a740. 质因数之和 -- 海豚原创 | From: [36.229.106.10] | 發表日期 : 2022-04-30 15:19

#include<iostream>
using namespace std;
int gcd(int a, int b);
int total(int num,int sum);
int main() {
    cin.tie(0), cin.sync_with_stdio(false);
    int num, sum = 0;
    while (cin >> num) {
        int answer = total(num,sum);
        cout << answer << endl;
    }
    return 0;
}
int total(int num,int sum) {
    int i = 2;
    while (num != i) {
        if (num % i == 0 && num != i) {
            int result = gcd(num, i);
            if (result == 1) {
                sum += i;
                num /= i; //num除掉因數後,繼續遞歸,直到num==i為止
                i = 2; //重製i值
            }
        }
        i++;
    }
    return sum + i;//回傳最後的總和
}
int gcd(int a, int b) {
    while (b != 0) {  //當餘數不為0時
        int temp = a % b;
        a = b;
        b = temp;
    }
    if (a == 1)return 0; //當餘數為0且不互質
    else return 1; //當餘數為0且互質
}

 
#30130: Re: 為甚麼這樣寫會TLE......


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
a740. 质因数之和 -- 海豚原创 | From: [39.10.162.231] | 發表日期 : 2022-04-30 17:01

1.
    while (num != i) {
2.
            int result = gcd(num, i);
3.
                i = 2; //重製i值

        i++;

  1. 只要找到平方根就好
  2. 不懂為何要用gcd,似乎總是回傳1
  3. 這種寫法會導致i只有第一次是2,之後都會從3開始,所以答案會出錯。可以把ˋi = 2刪掉,然後i++前面加else
 
ZeroJudge Forum