時間限制:1 秒 內存限制:32 兆 特殊判題:否 提交:699 解決:122
題目描述:
求正整數N(N>1)的質因數的個數。
相同的質因數需要重複計算。如120=2*2*2*3*5,共有5個質因數。
輸入:
可能有多組測試數據,每組測試數據的輸入是一個正整數N,(1<N<10^9)。
輸出:
對於每組數據,輸出N的質因數的個數。
樣例輸入:
120
樣例輸出:
5
提示:
注意:1不是N的質因數;若N爲質數,N是N的質因數。
//清華2010:題目1207:質因數的個數
//求正整數N(N>1)的質因數的個數 相同的質因數需要重複計算 如120=2*2*2*3*5 共有5個質因數
#include <iostream>
using namespace std;
int a[1000];
int main(){
int n;
int i, j;
while( cin >> n ){
for( i=2,j=0; i*i<=n; ){ //因式分解經典算法
if( n % i == 0 ){
a[j++] = i;
n /= i;
}
else
i++;
} //程序結束時 n爲殘留的最後一個因子
a[j] = n;
//for( i=0; i<=j; i++ )
// cout << a[i] << " ";
//cout << endl;
cout << j+1 << endl;
}
//system("pause");
return 0;
}
九度OJ 題目1208:10進制 VS 2進制
時間限制:1 秒 內存限制:32 兆 特殊判題:否 提交:201 解決:64
題目描述:
對於一個十進制數A,將A轉換爲二進制數,然後按位逆序排列,再轉換爲十進制數B,我們乘B爲A的二進制逆序數。
例如對於十進制數173,它的二進制形式爲10101101,逆序排列得到10110101,其十進制數爲181,181即爲173的二進制逆序數。
輸入:
一個1000位(即10^999)以內的十進制數。
輸出:
輸入的十進制數的二進制逆序數。
樣例輸入:
173
樣例輸出:
181
還沒做
九度OJ 題目1209:最小郵票數
時間限制:1 秒 內存限制:32 兆 特殊判題:否 提交:352 解決:85
題目描述:
有若干張郵票,要求從中選取最少的郵票張數湊成一個給定的總值。
如,有1分,3分,3分,3分,4分五張郵票,要求湊成10分,則使用3張郵票:3分、3分、4分即可。
輸入:
有多組數據,對於每組數據,首先是要求湊成的郵票總值M,M<100。然後是一個數N,N〈20,表示有N張郵票。接下來是N個正整數,分別表示這N張郵票的面值,且以升序排列。
輸出:
對於每組數據,能夠湊成總值M的最少郵票張數。若無解,輸出0。
樣例輸入:
10
5
1 3 3 3 4
樣例輸出:
3
//清華2010:題目1209:最小郵票數
//有多組數據 對於每組數據 首先是要求湊成的郵票總值M(M<100)
//然後是一個數N N<20 表示有N張郵票 接下來是N個正整數 分別表示這N張郵票的面值 且以升序排列
//說白了就是湊和數 歸類爲01揹包問題
#include <iostream>
//#include <fstream>
using namespace std;
#define INF 1000000000 //1000000000是個很大的不超INT_MAX的正數
int dp[1000], a[100];
int main() {
int m, n;
int i, j, k;
//ifstream cin("THU_1209.txt");
while( cin >> m >> n ){
for( i=0; i<n; i++ )
cin >> a[i];
for( i=1; i<=m; i++ )
dp[i] = INF;
dp[0] = 0;
for( i=0; i<n; i++ )
for( j=m; j>=a[i]; j-- )
if( dp[j-a[i]] != INF )
dp[j] = min( dp[j], dp[j-a[i]]+1 );
if(dp[m] == INF)
cout << "0" << endl;
else
cout << dp[m] << endl;
}
//system("pause");
return 0;
}