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


shawn2000100 (東華財金)


#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 (卓承緯)


#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)


因為1沒有質因數




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


anandrewboy70900 (ShowTsai)


因為1沒有質因數


阿 看錯了

因為n如果不是1

n就是質數

所以sum還要+n

應該是這樣吧...




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


anandrewboy70900 (ShowTsai)


因為1沒有質因數


阿 看錯了

因為n如果不是1

n就是質數

所以sum還要+n

應該是這樣吧...



說錯 ans+n




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


kev8067@gmail.com (卓承緯)


因為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)


因為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 (卓承緯)


因為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裡。

感謝您的解答