#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;
}
#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; 呢?
因為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
因為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裡。
感謝您的解答