#12517: C++ 簡易參考解答


shawn2000100 (東華財金)

學校 : 國立東華大學
編號 : 57300
來源 : [27.53.168.5]
最後登入時間 :
2021-09-19 19:53:19
a740. 质因数之和 -- 海豚原创 | From: [36.227.228.42] | 發表日期 : 2017-08-06 01:05

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

const unsigned long long int SIZE = 20000001;
bool prime[SIZE];
vector <unsigned long long int> table;

int main() {
memset ( prime, true, SIZE );
unsigned long long int i, j, n, ans;

for ( i = 2; i < SIZE; ++i )
if ( prime[i] ) {
table.push_back ( i );

for ( j = 2 * i; j < SIZE; j += i )
prime[j] = false;
}

while ( cin >> n ) {
ans = 0;

for ( i = 0; i < table.size() && n > 1; ++i )
while ( 0 == n % table.at ( i ) ) {
ans += table.at ( i );
n /= table.at ( i );
}

cout << ( ( 1 == n ) ? ans : ans + n ) << endl;
}

return 0;
}

 
#13964: Re:C++ 簡易參考解答


kev8067@gmail.com (卓承緯)

學校 : 不指定學校
編號 : 74409
來源 : []
最後登入時間 :
2018-01-11 15:15:59
a740. 质因数之和 -- 海豚原创 | From: [223.137.108.12] | 發表日期 : 2018-05-21 16:26

#include
#include
#include
using namespace std;

const unsigned long long int SIZE = 20000001;
bool prime[SIZE];
vector table;

int main() {
memset ( prime, true, SIZE );
unsigned long long int i, j, n, ans;

for ( i = 2; i < SIZE; ++i )
if ( prime[i] ) {
table.push_back ( i );

for ( j = 2 * i; j < SIZE; j += i )
prime[j] = false;
}

while ( cin >> n ) {
ans = 0;

for ( i = 0; i < table.size() && n > 1; ++i )
while ( 0 == n % table.at ( i ) ) {
ans += table.at ( i );
n /= table.at ( i );
}

cout << ( ( 1 == n ) ? ans : ans + n ) << endl;
}

return 0;
}

請問為什麼不能直接cout<<sum<<endl; 呢?

 
#13965: Re:C++ 簡易參考解答


anandrewboy70900 (ShowTsai)

學校 : 國立中央大學
編號 : 27736
來源 : [203.204.218.144]
最後登入時間 :
2024-10-11 16:21:37
a740. 质因数之和 -- 海豚原创 | From: [140.115.204.235] | 發表日期 : 2018-05-21 21:00

因為1沒有質因數




 
#13966: Re:C++ 簡易參考解答


anandrewboy70900 (ShowTsai)

學校 : 國立中央大學
編號 : 27736
來源 : [203.204.218.144]
最後登入時間 :
2024-10-11 16:21:37
a740. 质因数之和 -- 海豚原创 | From: [140.115.204.235] | 發表日期 : 2018-05-21 21:05

因為1沒有質因數


阿 看錯了

因為n如果不是1

n就是質數

所以sum還要+n

應該是這樣吧...




 
#13967: Re:C++ 簡易參考解答


anandrewboy70900 (ShowTsai)

學校 : 國立中央大學
編號 : 27736
來源 : [203.204.218.144]
最後登入時間 :
2024-10-11 16:21:37
a740. 质因数之和 -- 海豚原创 | From: [140.115.204.235] | 發表日期 : 2018-05-21 21:06

因為1沒有質因數


阿 看錯了

因為n如果不是1

n就是質數

所以sum還要+n

應該是這樣吧...



說錯 ans+n




 
#13969: Re:C++ 簡易參考解答


kev8067@gmail.com (卓承緯)

學校 : 不指定學校
編號 : 74409
來源 : []
最後登入時間 :
2018-01-11 15:15:59
a740. 质因数之和 -- 海豚原创 | From: [114.136.66.48] | 發表日期 : 2018-05-22 09:53

因為1沒有質因數


阿 看錯了

因為n如果不是1

n就是質數

所以sum還要+n

應該是這樣吧...



說錯 ans+n




for ( i = 0; i < table.size() && n > 1; ++i )
while ( 0 == n % table.at ( i ) ) {
ans += table.at ( i );
n /= table.at ( i );
}
這邊不就會把ans+n了嗎?

 
#13975: Re:C++ 簡易參考解答


anandrewboy70900 (ShowTsai)

學校 : 國立中央大學
編號 : 27736
來源 : [203.204.218.144]
最後登入時間 :
2024-10-11 16:21:37
a740. 质因数之和 -- 海豚原创 | From: [140.115.204.235] | 發表日期 : 2018-05-22 19:56

因為1沒有質因數


阿 看錯了

因為n如果不是1

n就是質數

所以sum還要+n

應該是這樣吧...



說錯 ans+n




for ( i = 0; i < table.size() && n > 1; ++i )
while ( 0 == n % table.at ( i ) ) {
ans += table.at ( i );
n /= table.at ( i );
}
這邊不就會把ans+n了嗎?

沒有阿

他這邊就是在做質因數分解

如果for迴圈跑完

表示他table裡的每一個質數都試過了

這時如果n還是>1

表示n一定是質數

所以ans要+n

 
#13976: Re:C++ 簡易參考解答


kev8067@gmail.com (卓承緯)

學校 : 不指定學校
編號 : 74409
來源 : []
最後登入時間 :
2018-01-11 15:15:59
a740. 质因数之和 -- 海豚原创 | From: [114.136.66.48] | 發表日期 : 2018-05-23 10:49

因為1沒有質因數


阿 看錯了

因為n如果不是1

n就是質數

所以sum還要+n

應該是這樣吧...



說錯 ans+n




for ( i = 0; i < table.size() && n > 1; ++i )
while ( 0 == n % table.at ( i ) ) {
ans += table.at ( i );
n /= table.at ( i );
}
這邊不就會把ans+n了嗎?

沒有阿

他這邊就是在做質因數分解

如果for迴圈跑完

表示他table裡的每一個質數都試過了

這時如果n還是>1

表示n一定是質數

所以ans要+n

了解,不過我覺得原因是在於這個n過大 是質數但不在Table的範圍裡,所以ans+n。

其他在Table的質數會在for loop被+到ans裡。

感謝您的解答

 
ZeroJudge Forum