质因数的个数
题目:
代码:
#include <cmath>
#include <iostream>
#include <math.h>
using namespace std;
int sum;
// 判断是否素数
bool isPrime(int n){
if(n==2) return true;
for(int i=2;i<sqrt(n);i++){
if(n%i==0) return false;
}
return true;
}
// 求质因子个数
int Primenum(int n){
int i;
// 如果他本身就是素数 ,1*它本身,也就是只有1个质因数,即它本身。
if(isPrime(n)) {
sum++;
return 0;
}
for(i=2;i<sqrt(n);i++){
// 如果能被i整除,并且是素数
if(n%i==0&&isPrime(i)) break;
}
sum++;
return Primenum(n/i);
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
sum = 0;
Primenum(n);
printf("%d",sum);
}
return 0;
}
二叉树的中序遍历
题目
代码
#include <iostream>
#include <cstdio>
using namespace std;
struct Node{
char ch;
struct Node* left = NULL;
struct Node* right = NULL;
};
int i; //计数器
//构造二叉树
void buildTree(Node* &node,string str){
// 遍历到字符串末尾位置
if (i == str.length()) {
return ;
}
// 遍历到空节点
if (str[i] == '#') {
i++;
return ;
}
// 扫描到正常的数字
node = new Node;
node->ch = str[i++]; //引用完i之后++
node->left = node->right = NULL;
buildTree(node->left,str);
buildTree(node->right,str);
}
// 中序遍历
void inOrderTraverse(Node* T)
{
if(T!=NULL)
{
inOrderTraverse(T->left);
// 绝了 如果是char,不能用%s进行打印
//printf("%c ",T->ch);
cout << T->ch << " ";
inOrderTraverse(T->right);
}
}
int main()
{
string str;
Node *r;
while(cin>>str)
{
i = 0;
// 建树
buildTree(r,str);
// 中序遍历树
inOrderTraverse(r);
printf("\n");
}
return 0;
}
最小邮票数
题目:
代码:
#include <iostream>
#include <vector>
#define MAXM 101
#define MAXN 21
#define MAX 99999
using namespace std;
int main(){
//dp数组初始化
int dp[MAXN][MAXM];
for(int i=0;i<MAXN;i++){
for(int j=0;j<MAXM;j++){
dp[i][j]=MAX;
}
}
for(int i=0;i<MAXN;i++)dp[i][0]=0;//当面额为0时,不需要邮票
int M;//总值
cin>>M;
int N;//邮票数
cin>>N;
vector<int> stamps;//邮票的面值
int stamp;
for(int i=1;i<=N;i++){
cin>>stamp;
stamps.push_back(stamp);
}
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
//考虑前i张邮票,总值为j
if(stamps[i-1]<=j){
//要么选,要么不选
dp[i][j]=min(dp[i-1][j],dp[i-1][j-stamps[i-1]]+1);
}
else{
//若当前面值大于总值,赋予用更小的面值凑成总值的结果。
dp[i][j]=dp[i-1][j];
continue;
}
}
}
if(dp[N][M]!=MAX){
cout<<dp[N][M]<<endl;
}
else{
cout<<0<<endl;
}
return 0;
}
递推数列
题目:
代码
#include<iostream>
using namespace std;
int main()
{
int a0,a1,p,q,k;
int sum[1000];
cin>>a0>>a1>>p>>q>>k;
sum[0]=a0;
sum[1]=a1;
for(int i=2;i<=k;i++)
{
sum[i]=(p*sum[i-1]+q*sum[i-2])%10000;
}
cout<<sum[k]<<endl;
}
最大序列和
题目
关键词:非空连续子序列T中所有数的和为T的"序列和"
代码:
#include <stdio.h>
int main()
{
int n,i,max;
while(scanf("%d",&n)!=EOF)
{
int a[n];
scanf("%d",&a[0]);
max=a[0];
for(i=1;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]+a[i-1]>a[i])
a[i]=a[i]+a[i-1];
if(a[i]>max)
max=a[i];
}
printf("%d\n",max);
}
return 0;
}