#include<iostream>usingnamespace std;intmain(){int n;
cin >> n;int num =0;for(int i =0; i <=32; i++){if(n &(1<< i))
num++;}
cout << num << endl;return0;}
#include<iostream>usingnamespace std;intmain(){int n;
cin >> n;int num =0;while(n){if(n %2==1)
num++;
n /=2;}
cout << num << endl;return0;}
T16. 购物单
#include<iostream>#include<vector>usingnamespace std;//总钱数小于32000int dp[32000];intmain(){int N, m;
cin >> N >> m;//定义几个数组
vector<int>zj(m+1),zjvw(m+1),fj1(m+1),fj1vw(m+1),fj2(m+1),fj2vw(m+1);for(int i =1; i <= m;++i){int v, p, q;
cin >> v >> p >> q;//主件if(q ==0){
zj[i]= v;
zjvw[i]= v * p;}//附件1//不是i//q值对应的是从属的主件elseif(fj1[q]==0){
fj1[q]= v;
fj1vw[q]= v * p;}//附件2elseif(fj2[q]==0){
fj2[q]= v;
fj2vw[q]= v * p;}}//动态规划for(int i =1; i <= m;++i){for(int j = N; j >=1; j--){//只要主件if(j >= zj[i])
dp[j]=max(dp[j], dp[j-zj[i]]+ zjvw[i]);//主件+附件1if(j >= zj[i]+ fj1[i])
dp[j]=max(dp[j], dp[j-zj[i]-fj1[i]]+ zjvw[i]+fj1vw[i]);//主件+附件2if(j >= zj[i]+ fj2[i])
dp[j]=max(dp[j], dp[j-zj[i]-fj2[i]]+ zjvw[i]+fj2vw[i]);//主件+附件1+附件2if(j >= zj[i]+ fj1[i]+ fj2[i])
dp[j]=max(dp[j], dp[j-zj[i]-fj1[i]-fj2[i]]+ zjvw[i]+fj1vw[i]+fj2vw[i]);}}
cout << dp[N]<< endl;return0;}
T17. 坐标移动
#include<iostream>#include<vector>#include<string>usingnamespace std;intmain(){
string str;while(cin >> str){//初始化坐标int x =0, y =0;//存储单步操作
vector<string> steps;//把字符串拆分int wordlen =0;for(int i =0; i < str.size();++i){while(str[i]!=';')
wordlen ++, i++;
steps.push_back(str.substr(i - wordlen, wordlen));
wordlen =0;}//对单个steps执行坐标变换for(int i =0; i < steps.size();++i){int num =0;//长度3 A10if(steps[i].length()==3&& steps[i][1]<='9'&& steps[i][1]>='0'&& steps[i][2]<='9'&& steps[i][2]>='0')
num =(steps[i][1]-'0')*10+ steps[i][2]-'0';//长度2 A5if(steps[i].length()==2&& steps[i][1]<='9'&& steps[i][1]>='0')
num = steps[i][1]-'0';switch(steps[i][0])//ASDW{case'A': x -= num;break;case'D': x += num;break;case'W': y += num;break;case'S': y -= num;break;default:break;}}
cout << x <<','<< y << endl;}return0;}
T18. 识别有效的IP地址和掩码并进行分类统计
#include<iostream>#include<vector>#include<algorithm>usingnamespace std;intstrtoint(string str){//68int sum =0;for(int i =0; i < str.size(); i ++)
sum = sum *10+ str[i]-'0';return sum;}
vector<int>toint(string str){
vector<int> res;//10.70.44.68int len =0;for(int i =0; i < str.size(); i ++){while(str[i]!='.'&& i < str.size())
i ++, len ++;
string nums = str.substr(i - len, len);int num =strtoint(nums);
res.push_back(num);
len =0;}return res;}boolismask(vector<int> mask){//255 254 255 0//长度 == 4//1在前if(mask.size()!=4)returnfalse;if(mask[0]==255){if(mask[1]==255){if(mask[2]==255){//8位2进制//7个1 6个1 .。。 1个1 + 000if(mask[3]==254|| mask[3]==252|| mask[3]==248|| mask[3]==240|| mask[3]==224|| mask[3]==192|| mask[3]==128|| mask[3]==0)returntrue;elsereturnfalse;}else{if(mask[2]==254|| mask[2]==252|| mask[2]==248|| mask[2]==240|| mask[2]==224|| mask[2]==192|| mask[2]==128|| mask[2]==0)if(mask[3]==0)returntrue;elsereturnfalse;}}else{if(mask[1]==254|| mask[1]==252|| mask[1]==248|| mask[1]==240|| mask[1]==224|| mask[1]==192|| mask[1]==128|| mask[1]==0)if(mask[3]==0&& mask[2]==0)returntrue;elsereturnfalse;}}else{if(mask[0]==254|| mask[0]==252|| mask[0]==248|| mask[0]==240|| mask[0]==224|| mask[0]==192|| mask[0]==128)if(mask[1]==0&& mask[2]==2&& mask[3]==0)returntrue;elsereturnfalse;}returnfalse;}intmain(){
vector<int>res(7,0);
string str;while(cin >> str){//10.70.44.68~255.254.255.0//分割ip mask
string ips, masks;
vector<string> temp;int len =0;for(int i =0; i < str.size(); i ++){while(str[i]!='~'&& i < str.size())
i ++, len ++;
string s = str.substr(i - len, len);
temp.push_back(s);
len =0;}
ips = temp[0];
masks = temp[1];//cout << ips << ' ' << masks << endl;//分割成功//字符串 二进制 比较大小 转换成int
vector<int> ip, mask;
ip =toint(ips);
mask =toint(masks);//子网掩码 11111 0000if(ismask(mask)){//判断ip//A类地址1.0.0.0~126.255.255.255;//B类地址128.0.0.0~191.255.255.255;//C类地址192.0.0.0~223.255.255.255;//D类地址224.0.0.0~239.255.255.255;//E类地址240.0.0.0~255.255.255.255//私网IP范围是//10.0.0.0~10.255.255.255//172.16.0.0~172.31.255.255//192.168.0.0~192.168.255.255if(ip[1]>=0&& ip[1]<=255&& ip[2]>=0&& ip[2]<=255&& ip[3]>=0&& ip[3]<+255){if(ip[0]>=1&& ip[0]<=126)//A{
res[0]++;if(ip[0]==10)//私有
res[6]++;}elseif(ip[0]>=128&& ip[0]<=191)//b{
res[1]++;if(ip[0]==172&& ip[1]>=16&& ip[1]<=31)//私有
res[6]++;}elseif(ip[0]>=192&& ip[0]<=223)//c{
res[2]++;if(ip[0]==192&& ip[1]==168)//私有
res[6]++;}elseif(ip[0]>=224&& ip[0]<=239)//d
res[3]++;elseif(ip[0]>=240&& ip[0]<=255)//e
res[4]++;}}else
res[5]++;}//A~E 0~4//错误 5//私有 6
cout << res[0]<<' '<< res[1]<<' '<< res[2]<<' '<< res[3]<<' '<< res[4]<<' '<< res[5]<<' '<< res[6]<< endl;return0;}
T19. 简单错误记录
#include<iostream>#include<string.h>usingnamespace std;//文件名 行数 次数struct record
{char s[100];int col;int count;};intmain(){char filename[100];int col;int cnt =0;//总记录条数 8
record rec[10000];while(cin >> filename >> col){//分隔 /路径//E:\V1R2\product\fpgadrive.c 1325//fpgadrive.cchar*p =strrchr(filename,'\\');
p++;if(strlen(p)>16)//截取后16位
p = p +(strlen(p)-16);int flag =0;//查重for(int i =0; i < cnt;++i){if(strcmp(rec[i].s, p)==0&& rec[i].col == col){
rec[i].count ++;
flag =1;break;}}if(!flag)//没有当前错误记录,全部插进去{strcpy(rec[cnt].s, p);
rec[cnt].col = col;
rec[cnt].count =1;
cnt ++;}}//输出8条int i =0;if(cnt >8)
i = cnt -8;else i =0;for(; i < cnt;++i){
cout << rec[i].s <<" "<< rec[i].col <<" "<< rec[i].count << endl;}return0;}
T20. 密码验证合格程序
#include<iostream>#include<vector>#include<string.h>usingnamespace std;intmain(){
vector<string> res;//OK NG
string str;while(cin >> str){int num[4]={0};//1.长度超过8位if(str.size()<=8)
res.push_back("NG");else{//2.包括大小写字母.数字.其它符号,以上四种至少三种for(auto it = str.begin(); it != str.end(); it++){if((*it)>='A'&&(*it)<='Z') num[0]=1;elseif((*it)>='a'&&(*it)<='z') num[1]=1;elseif((*it)>='0'&&(*it)<='9') num[2]=1;else num[3]=1;}int count =0;for(int i =0; i <4; i++){
count += num[i];}if(count <3)
res.push_back("NG");else{//3.不能有相同长度大于等于2的子串重复//查找字符串a是否包含子串b,不是用strA.find(strB) > 0//而是strA.find(strB) != string :: npos;//其中string :: npos是个特殊值,说明查找没有匹配//string::size_type pos = strA.find(strB);
string::size_type pos;for(int i =0; i < str.size(); i++){
string sub = str.substr(i,3);
pos = str.find(sub, i +3);if(pos != string::npos)break;}if(pos == string::npos)
res.push_back("OK");else
res.push_back("NG");}}}for(auto x : res)
cout << x << endl;return0;}
T22. 汽水瓶
#include<iostream>usingnamespace std;intmain(){int empty;//空瓶子数量int res =0;//总共换了多少瓶while(cin >> empty){int new1, hold;while(empty >=2){//只有2瓶//借一瓶 还3空if(empty ==2)
res++, empty =0;else{
new1 = empty /3;
hold = empty %3;
res += new1;
empty = new1 + hold;}}
cout << res << endl;
res =0;}return0;}
T24. 合唱队
#include<iostream>#include<vector>#include<algorithm>usingnamespace std;voidcalcu(vector<int> height, vector<int>&incnum){//计算以height为最高的递增队列人数for(int i =1; i < height.size(); i++){for(int j = i -1; j >=0; j--){if(height[j]< height[i]&& incnum[i]< incnum[j]+1)
incnum[i]= incnum[j]+1;}}}intmain(){int n;while(cin >> n){
vector<int> height;
vector<int>incnum(n,1);
vector<int>decnum(n,1);
vector<int> realnum;int h;for(int i =0; i < n; i++)
cin >> h, height.push_back(h);//求递增序列数组人数calcu(height, incnum);//求递减序列数组人数reverse(height.begin(), height.end());calcu(height, decnum);reverse(decnum.begin(), decnum.end());int maxnum =0;for(int i =0; i < n;++i){
realnum.push_back(incnum[i]+decnum[i]-1);//减掉自身的
maxnum =max(maxnum, realnum[i]);}
cout << n - maxnum << endl;}return0;}
#include<iostream>#include<vector>#include<math.h>//匈牙利算法usingnamespace std;int t[100][100]={0};
vector<int>ji(100,-1);
vector<int>ou(100,-1);
vector<int>visit(100,0);boolisprime(int n){int flag =0;for(int i =2; i <= n / i; i ++)if(n % i ==0){
flag =1;break;}if(flag ==0)returntrue;returnfalse;}intdfs(int i){//找到 返回1 没找到返回0for(int j =0; j <100; j ++){if(t[i][j]==1&&!visit[j]){
visit[j]=1;// ij匹配if(ou[j]==-1||dfs(ou[j])){
ji[i]= j;
ou[j]= i;return1;}}}return0;}intmain(){int n;//素数 偶数+奇数//素数伴侣 一定是 偶数 + 奇数
vector<int> cou, cji;while(cin >> n){for(int i =0; i < n; i ++){int temp;
cin >> temp;if(temp %2!=0) cji.push_back(temp);//奇数else cou.push_back(temp);//偶数}for(int i =0; i < cji.size(); i ++)for(int j =0; j < cou.size(); j ++)if(isprime(cji[i]+ cou[j])) t[i][j]=1;//匈牙利算法int res =0;for(int i =0; i < cji.size(); i ++){if(ji[i]==-1){for(int j =0; j < visit.size(); j ++) visit[j]=0;
res +=dfs(i);//增广路径 每多找到一组 +1}}
cout << res << endl;//清空
cji.clear();
cou.clear();for(int i =0; i <100; i ++)for(int j =0; j <100; j ++)
t[i][j]=0;for(int i =0; i <100; i ++)
ji[i]= ou[i]=-1;}return0;}
T29. 字符串加解密
#include<iostream>#include<string.h>usingnamespace std;
string data1 ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
string data2 ="BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890";intmain(){
string str1, str2;while(cin >> str1 >> str2){for(int i =0; i < str1.size(); i ++)
str1[i]= data2[data1.find(str1[i])];for(int i =0; i < str2.size(); i ++)
str2[i]= data1[data2.find(str2[i])];
cout << str1 << endl << str2 << endl;}return0;}
T30. 字符串合并处理
#include<iostream>#include<string>#include<algorithm>usingnamespace std;const string helper1 ="0123456789abcdefABCDEF";const string helper2 ="084C2A6E195D3B7F5D3B7F";intmain(){
string str1, str2, mergestr;while(cin >> str1 >> str2){
mergestr = str1 + str2;//奇数 偶数分别拆开
string strji, strou;for(int i =0; i < mergestr.size(); i++){if( i %2==0)
strou += mergestr[i];else
strji += mergestr[i];}//排序后合并sort(strji.begin(), strji.end());sort(strou.begin(), strou.end());int index =0;for(int i =0; i < mergestr.size(); i++){if(i %2==0)
mergestr[i]= strou[i /2];else
mergestr[i]= strji[i /2];}//加密for(int i =0; i < mergestr.size(); i++){int idx = helper1.find(mergestr[i]);if(idx !=-1)
mergestr[i]= helper2[idx];}
cout << mergestr << endl;}return0;}
T37. 统计每个月兔子的总数
#include<iostream>usingnamespace std;intmain(){int month;while(cin >> month){int first =1, second =0, third =0;//初试第一二三月兔子总数//first 年龄1个月的兔子数量//second 年龄2个月的兔子数量//third 年龄3个月的兔子数量while(-- month){
third += second;
second = first;
first = third;}
cout << first + second + third << endl;}return0;}
T50. 四则运算
T53. 杨辉三角的变形
#include<iostream>#include<string>#include<vector>usingnamespace std;intmain(){int n, m;while(cin>>n){
m =2*n -1;
vector<vector<int>>dp(n, vector<int>(m,0));
dp[0][n-1]=1;for(int i=1; i<n; i++){for(int j =0; j<m;++j){
dp[i][j]= dp[i-1][j-1]+ dp[i-1][j]+ dp[i-1][j+1];}}int k;for(k=0; k<m; k++){if(dp[n-1][k]%2==0&& dp[n-1][k]!=0){
cout<<k+1<<endl;break;}}if(k == m)
cout<<-1<<endl;}return0;}