/*
把任意一个十进制数转化为十二进制,同时支持负数转换
*/#include<bits/stdc++.h>usingnamespace std;intmain(){printf("请输入一个十进制数:\n");bool flag =false;int n;scanf("%d",&n);if(n<0){
flag =true;
n =abs(n);}
string str="";while(n!=0){int x = n%12;if(x ==10) str+="A";elseif(x ==11) str+="B";else str +=x+'0';
n = n /12;}reverse(str.begin(),str.end());if(flag) cout<<"-";
cout<<str;return0;}
2、十二进制转换为十进制
/*
把任意一个十二进制数转化为十进制,秦九韶算法
*/#include<bits/stdc++.h>usingnamespace std;intmain(){printf("请输入一个十二进制数:\n");
string str ;
cin>>str;int res =0;int n = str.size();for(int i =0;i < n ;i ++){if(str[i]=='A'){
res = res *12+10;}elseif(str[i]=='B'){
res = res *12+11;}else{
res = res *12+ str[i]-'0';}}printf("%d",res);return0;}
3、过滤重复字符串
/*
过滤一个重复字符串:栈思想的运用
*/#include<bits/stdc++.h>usingnamespace std;intmain(){printf("请输入一个字符串:\n");
string str ;
cin>>str;
stack<char> st;int n =str.size();for(int i =0; i < n ;i ++){if(st.empty()|| st.top()!=str[i])
st.push(str[i]);}
string res ="";while(st.size()){
res += st.top();
st.pop();}reverse(res.begin(),res.end());
cout<< res;return0;}
4、求最大公共子串
/*
求最大公共子串,动态规划O(n^2)
*/#include<bits/stdc++.h>usingnamespace std;constint N =1e4+10;int dp[N][N];intmain(){printf("请输入一个字符串:\n");printf("请输入第二个字符串\n");
string str1,str2;
cin>>str1>>str2;int res =0,pos =0;for(int i =1;i <= str1.size();i ++){for(int j =1;j<= str2.size();j ++){if(str1[i-1]== str2[j-1]){
dp[i][j]= dp[i-1][j-1]+1;if(res<dp[i][j]){
res = dp[i][j];
pos = i;}}else{
dp[i][j]=0;}}}
cout<<str1.substr(pos-res,res);return0;}
/*
字符串转置,双指针模拟,实现了trim操作
eg:输入:To be or not to be
输出:oT eb ro ton ot eb
*/#include<bits/stdc++.h>usingnamespace std;intmain(){printf("请输入一个字符串:");
string str ;getline(cin, str);int n = str.size();
cout<<endl;for(int i =0,j=0;j < n ;){while(j <n && str[j]==' ') j++;
i = j ;while(j < n && str[j]!=' ') j++;for(int k = j-1;k>=i ; k--){printf("%c",str[k]);}while(j <n && str[j]==' ') j++;if(j!=n)printf(" ");}return0;}
/*
完数:一个数恰好等于出塔本身意外的因子之和
eg:6 = 1 + 2 + 3
*/#include<bits/stdc++.h>usingnamespace std;booljudge(int n){int res =0;for(int i =1;i <=n/i; i++){if(n%i==0){if(i<n) res +=i;if(n/i<n && n/i!=i) res +=n/i;}}return res ==n;}intmain(){for(int i =1;i <=1000;i++){if(judge(i)){printf("%d\n",i);}}return0;}
10、猴子选大王
约瑟夫环问题,不介绍了,我主要采用的是模拟大法,网上也有数学推导。
/*
模拟大法
*/#include<bits/stdc++.h>usingnamespace std;intmain(){int n ,m;scanf("%d%d",&n,&m);int i =1,j =0,count = n;bool st[n+1];memset(st,0x3f,sizeof st);while(count>1){if(st[i]){
j++;if(j==m){
st[i]=false;printf("%d号猴子出局\n",i);
count --;
j=0;}}
i++;if(i==n+1) i=1;}for(int i =1;i <= n ;i ++){if(st[i])printf("%d号猴子留下",i);}return0;}
11、约舍夫环
/*
约舍夫环问题
约瑟夫环问题,不介绍了,我主要采用的是模拟大法,网上也有数学推导。
*/#include<bits/stdc++.h>usingnamespace std;intmain(){int n ,k,m;scanf("%d%d%d",&n,&k,&m);int i =k,j =0,count = n;bool st[n+1];memset(st,0x3f,sizeof st);while(count>1){if(st[i]){
j++;if(j==m){
st[i]=false;printf("%d号人出局\n",i);
count --;
j=0;}}
i++;if(i==n+1) i=1;}for(int i =1;i <= n ;i ++){if(st[i])printf("%d号人留下",i);}return0;}
12、大数加法
/*
大数相加
介绍,在超出计算机进制的加和中实现加法运算,也叫高精度加法,例如999999999999999+ 99999999999999(无数个9)加和
解法:如图中所示,比较简单的写法,还有一种是压位写法速度更快,效率更高。
*/#include<bits/stdc++.h>usingnamespace std;intmain(){
string str1,str2,res;printf("输入第一个数:\n输入第二个数:");
cin>>str1>>str2;int flag =0;for(int i = str1.size()-1,j=str2.size()-1;i>=0||j>=0||flag;i--,j--){int sum =0;if(i>=0){
sum += str1[i]-'0';}if(j>=0){
sum+=str2[j]-'0';}
sum += flag;
res += sum%10+'0';
flag = sum /10;}reverse(res.begin(),res.end());
cout<<res;return0;}// 压9位高精度加法#include<bits/stdc++.h>usingnamespace std ;constint base =1e9;
vector<int>add(vector<int>&A,vector<int>&B){if(A.size()< B.size())returnadd(B,A);
vector<int> C;int t =0;for(int i =0;i <A.size();i ++){
t += A[i];if(i < B.size()) t += B[i];
C.push_back(t % base);
t /= base;}if(t ) C.push_back(t);return C;}intmain(){
string a,b;
vector<int> A,B;
cin >> a >>b;for(int i = a.size()-1,s=0,j =0,t=1;i >=0;i --){
s +=(a[i]-'0')* t;
j ++, t*=10;if(j ==9|| i ==0){
A.push_back(s);
s = j =0;
t =1;}}for(int i = b.size()-1,s =0,j =0,t =1;i >=0;i --){
s +=(b[i]-'0')* t;
j ++, t *=10;if(j ==9|| i ==0){
B.push_back(s);
s = j =0;
t =1;}}auto c =add(A,B);
cout << c.back();for(int i = c.size()-2;i >=0;i --)printf("%09d",c[i]);return0;}
13、加和
/*
加和 回溯
题意介绍:给定一个整数,和一个数组,找到在这n个数组中加和为t的所有组合。
方法:采用dfs的方法解决。
*/#include<bits/stdc++.h>usingnamespace std;
vector<int> path;int sum;int t ;
vector<int> nums;voiddfs(int t,int start){if(sum >t)return;if(sum == t){for(int i=0;i < path.size();i ++){printf("%d",path[i]);if(i !=path.size()-1)printf("+");}printf("\n");return;}for(int i = start ; i< nums.size()&& t-sum>=nums[i]; i++){if(i>start && nums[i]== nums[i-1])continue;
path.push_back(nums[i]);
sum += nums[i];dfs(t,i+1);
sum -=nums[i];
path.pop_back();}}intmain(){int t ,n;printf("请输入t和n\n");scanf("%d%d",&t,&n);for(int i=1;i <= n ;i ++){int x ;scanf("%d",&x);
nums.push_back(x);}sort(nums.begin(),nums.end());dfs(t,0);return0;}
14、字符串删除
/*
字符串删除,代码优化
在一个数组是s1中删除含有s2的字串(这个应该是子数组,由于拿到手的资料是这样叙述的,暂时采用这个叙述),
输出字串的个数,并且输出剩余的字符串
eg:输入:ababababac
aba
输出:2
bbac
*/#include<bits/stdc++.h>usingnamespace std;intmain(){
string s1,s2;
cin>>s1>>s2;int num =0;for(int i =0,j=0;i < s1.size();){int t = s1.find(s2,i);if(t==-1){while(i<s1.size()) cout<<s1[i++];}else{
num++;while(i<t) cout<<s1[i++];
i = t+s2.size();}}
cout<<endl;
cout<<num;return0;}
/*
字符串压缩,直接看实例。
eg:aaabbcddddde
输出:3a2bc5de
*/#include<bits/stdc++.h>usingnamespace std;intmain(){
string s1,res;
cin>>s1;for(int i =0;i<s1.size();){char c = s1[i];int len =0;while(i<s1.size()&& s1[i]==c){
len++;
i++;}if(len!=1){
res +=to_string(len);}
res+=c;}
cout<<res;return0;}
16、身份证号合法性判断
/*
简单叙述一下题意:
我国身份证为18位,17位数字,一位字母或者X:前六位地址码,第七到十位出生年份,十一十二位出生月份,第十三和十四位出生日期。
判断一个身份证是否位合法性:
1、合法,反悔0,
2、长度不合法,返回1
3、前17位出现非数字字符,返回2
4、第十八位非数字,非X,返回3
5、出生年份在(1990-2017)之外,返回4
6、出生月份不合法,返回5;
7、出生日期不合法,返回6
解题思路:大模拟题,本题调用了很多API,不会的请自行百度,目的是为了优化代码行数
*/#include<bits/stdc++.h>usingnamespace std ;
string ID;intcheckyear(int year){if(year %400==0|| year %4==0&& year %100!=0)return1;return0;}intcheck(string ID){int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if(ID.size()!=18)return1;int year =stoi(ID.substr(6,4));if(year <1990|| year >2017)return4;int month =stoi(ID.substr(10,2));if(month<0|| month >12)return5;int day =stoi(ID.substr(12,2));if(month!=2)if(day > months[month]|| day ==0)return6;elseif(day > months[month]+checkyear(year)|| day ==0)return6;for(int i =0;i <18;i ++){if(i <17&&!isdigit(ID[i]))return2;if(i ==17&&!isdigit(ID[i])&& ID[i]!='X')return3;}return0;//都没有问题,返回0}intmain(){
cin >> ID;
cout <<check(ID)<<endl;return0;}
17、判断是否是一个平方对称数
/*
题意介绍:判断一个数是不是平方对称数,例如 11的平方是121,11是平方对称数,解释11的平方是对称数。
*/#include<bits/stdc++.h>usingnamespace std;intmain(){for(int i =0;i <256;i ++){int x = i*i;
string res =to_string(x);bool flag =true;for(int i =0;i<=res.size()/2;i++){if(res[i]!= res[res.size()-1-i]){
flag =false;break;}}if(flag)printf("%d\n",i);}return0;}
18、表达式求值
/*
表达式求值,给你一个数学计算表达式,让你计算计算后的结果。
eg:3*4
输出:12
*/#include<bits/stdc++.h>usingnamespace std;
stack<int> nums;
stack<char> op;voideval(){int t2 = nums.top();nums.pop();int t1 = nums.top();nums.pop();char c = op.top();op.pop();int r =0;if(c=='+') r = t1+t2;elseif(c =='-') r = t1-t2;elseif(c=='*') r = t1*t2;else r = t1/t2;
nums.push(r);}intmain(){
string s1;
cin>>s1;
map<char,int> pr ={{'+',1},{'-',1},{'*',2},{'/',2}};for(int i =0;i < s1.size();i ++){if(isdigit(s1[i])){int x =0,j= i;while(j<s1.size()&&isdigit(s1[j])) x = x*10+ s1[j++]-'0';
nums.push(x);
i = j-1;}elseif(s1[i]=='('){
op.push(s1[i]);}elseif(s1[i]==')'){while(op.size()&&op.top()!='('){eval();}
op.pop();}else{while(op.size()&&op.top()!='('&&pr[op.top()]>=pr[s1[i]])eval();
op.push(s1[i]);}}while(op.size())eval();printf("%d",nums.top());return0;}
/*
直接看示例:
输入:student. a am I
输出:I am a student.
*/#include<bits/stdc++.h>usingnamespace std;intmain(){
string s1;getline(cin,s1);
stack<string> st;for(int i =0,j =0; i<s1.size();){
string temp ="";while(j<s1.size()&& s1[j]==' ') j++;
i = j;while(j<s1.size()&&s1[j]!=' ') j++;for(int k = j-1;k>=i;k--) temp += s1[k];
st.push(temp);
i = j;}while(st.size()){
cout<<st.top();
st.pop();if(st.size()) cout<<" ";}return0;}
22、哈夫曼树问题
/*
大概题意:给你个n,给你个数组,让你求合并后的最小值
*/#include<bits/stdc++.h>usingnamespace std ;constint N =1e5+10;int n;int q[N];intmain(){scanf("%d",&n);
priority_queue<int,vector<int>,greater<int>> heap;for(int i =0;i < n ;i ++){int x ;scanf("%d",&x);
heap.push(x);}int res =0;while(heap.size()>1){int t1 = heap.top();heap.pop();int t2 = heap.top();heap.pop();
res += t1 + t2;
heap.push(t1+t2);}
cout << res<<endl;return0;}