蓝桥杯c++b组练习题自用记录4

枚举与尺取

题目:第几个幸运数字

#include<bits/stdc++.h>
using namespace std;
 
int main(){
	int i,j,k;
	long long n=59084709587505;
	int cnt=0;
	for(i=0;pow(7,i)<n;i++)
		for(j=0;pow(5,j)<n;j++)
			for(k=0;pow(3,k)<n;k++)
				if(pow(7,i)*pow(5,j)*pow(3,k)<=n)
					cnt++;
	cout<<cnt-1;//幸运数字不包括1 
	return 0;
}

题目:特别数的和

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long sum=0;
	int t,n;
	cin>>n;
	for(int i=1;i<=n;i++){
		t=i;
		while(t){
			if(t%10==2|t%10==0|t%10==1|t%10==9){
				sum=sum+i; //累加 
				break;
			}
			t=t/10;
		}	
	}
	cout<<sum;
	return 0;
} 

题目:单词分析

#include <bits/stdc++.h>
using namespace std;
int c[26];
int main()
{
  string a;
  cin>>a;
  int max=0;
  int b=97;
  char x;
  for(int i=0;i<a.length();i++)
  {
    c[a[i]-'a']++;//把每个字母的个数记录 'a'=97
  }
  for(int i=0;i<26;i++)
  {
    if(c[i]>max){
      max=c[i];//选出出现个数最多的字母 
      x=i+'a';//ASCII码转回字符 
    }
  }
  cout<<x<<endl<<max<<endl;
  return 0;
}

题目:排列型枚举(全排列)Ann

#include<bits/stdc++.h> 
using namespace std; 
 
int n;//共计个数
int order[20];
bool chosen[20];
int sum=0;
void calc(int k){
	if(k==n+1){
		for(int i=1;i<=n;i++){
			cout<<order[i]<<" ";//排列组 
		}
		sum++;//排列个数	
		puts("");
		return;
	}
	for(int i=1;i<=n;i++){
		if(chosen[i])
			continue;
		order[k]=i;
		chosen[i]=i;
		calc(k+1);
		chosen[i]=0;
		order[k]=0;
	}
} 
int main(){
	cin>>n;
	calc(1);
	cout<<sum;
	return 0;
}

题目:组合型枚举 Cnm

#include<bits/stdc++.h> 
using namespace std; 

int n;//共计个数
int m;//选m个数
vector<int> chosen;
string s[1050]; 
int sum=0;

void calc(int x){
	if(chosen.size()>m||chosen.size()+(n-x+1)<m)//剪枝
		return;
	if(x==n+1){//选够m个数输出 
		for(int i=0;i<chosen.size();i++)
			cout<<s[chosen[i]]<<" ";
		puts("");
		sum++;
		return;
	} 
	chosen.push_back(x);
	calc(x+1);
	chosen.pop_back();//消除痕迹
	calc(x+1); 
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s[i];//输入被选择的字符,如 1 2 3 4 5 
	}
	calc(1);
	cout<<sum;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值