兰州大学机试复试题

1、十进制转化为十二进制

/*
把任意一个十进制数转化为十二进制,同时支持负数转换
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
    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";
        else if(x == 11) str+="B";
        else str +=x+'0';
        n = n /12;
    }
    reverse(str.begin(),str.end());
    if(flag) cout<<"-";
    cout<<str;
    return 0;
}

2、十二进制转换为十进制

/*
把任意一个十二进制数转化为十进制,秦九韶算法
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
    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;
        }else if(str[i] =='B'){
            res = res * 12 +11;
        }else {
            res = res *12 + str[i] - '0';
        }
    }
    printf("%d",res);
    return 0;
}

3、过滤重复字符串

/*
过滤一个重复字符串:栈思想的运用
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
    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;
    return 0;
}

4、求最大公共子串

/*
求最大公共子串,动态规划O(n^2)
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
int dp[N][N];
int main(){
    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);
    return 0;
}

5、求N以内的所有素数

/*
N以内的所有素数,试除法
*/
/*
N以内的所有素数,试除法
*/
#include<bits/stdc++.h>
using namespace std;
int n;
bool scf(int n){
    if(n<2) return false;
    for(int i =2 ;i <= n/i ;i ++){
        if(n%i == 0){
            return false;
        }
    }
    return true;
}
int main(){
    printf("请输入一个数n:");
    scanf("%d\n",&n);
    for(int i =1 ;i <=n ;i ++){
        if(scf(i)) printf("%d ",i);
    }
    return 0;
}

6 、字符串转置

/*
字符串转置,双指针模拟,实现了trim操作
eg:输入:To be or not to be
	输出:oT eb ro ton ot eb
*/
#include<bits/stdc++.h>
using namespace std;


int main(){
    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(" ");
    }
    return 0;
    
}

7、星号排版

/*
星号排版 模拟大法
eg:
输入:13(奇数)
		  *
		 * *
		* * * 
      * * * * *
     * * * * * *
    * * * * * * *
     * * * * * *
      * * * * *
       * * * *  
        * * *
         * *
          *  
*/
#include<bits/stdc++.h>
using namespace std;

int n;
int main(){
    printf("请输入一个数(奇数)\n");
    scanf("%d\n",&n);
    for(int i = 0 ;i < n/2 ;i ++){
        for(int j = n/2-i;j>0;j--){
            printf(" ");
        }
        for(int k = i+1;k>0;k-- )
            printf("* ");
        printf("\n");
    }
    for(int i = 0 ;i <= n/2;i++){
        printf("* ");
    }
    printf("\n");
    for(int i = 0 ;i <n/2 ; i++){
        for(int k = i+1;k>0 ; k--)
            printf(" ");
        for(int j = n/2-i; j >0 ;j--){
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

8、求三角形面积

/*
星号排版 模拟大法
eg,输入 3,4,5(三角形三条边)
输出:
构成的话,输出面积,构不成的话输出无法构成(使用海伦公式)
*/
#include<bits/stdc++.h>
using namespace std;
bool judge(double a,double b,double c){
    if(a+b<c || a+c<b || b+c<a) return false;
    return true;
}
int main(){
    double a,b,c;
    scanf("输入三条边:%lf%lf%lf",&a,&b,&c);
    if(judge(a,b,c)) {
        double p = (a+b+c)/2;
        double area = sqrt(p*(p-a)*(p-b)*(p-c));
        printf("%.2f",area);
    }else{
        printf("无法构成三角形");
    }
    return 0;
}

9、完数

/*
完数:一个数恰好等于出塔本身意外的因子之和
	eg:6 = 1 + 2 + 3
*/
#include<bits/stdc++.h>
using namespace std;
bool judge(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;
}
int main(){
    for(int i = 1 ;i <= 1000 ;i++){
        if(judge(i)){
            printf("%d\n",i);   
        }
    }
    return 0;
}

10、猴子选大王

	约瑟夫环问题,不介绍了,我主要采用的是模拟大法,网上也有数学推导。
/*
模拟大法
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
   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);
   }
   return 0;
}

11、约舍夫环

/*
约舍夫环问题 
	约瑟夫环问题,不介绍了,我主要采用的是模拟大法,网上也有数学推导。
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
   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);
   }
   return 0;
}

12、大数加法

/*
大数相加
	介绍,在超出计算机进制的加和中实现加法运算,也叫高精度加法,例如999999999999999+ 99999999999999(无数个9)加和
	解法:如图中所示,比较简单的写法,还有一种是压位写法速度更快,效率更高。
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
    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;
    return 0;
}

// 压9位高精度加法
#include<bits/stdc++.h>

using namespace std ;

const int  base = 1e9;
vector<int> add(vector<int> &A,vector<int> &B){
    if(A.size() < B.size()) return add(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;
}
int main(){
    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]);
    return 0;
}

13、加和

/*
加和 回溯
题意介绍:给定一个整数,和一个数组,找到在这n个数组中加和为t的所有组合。
	方法:采用dfs的方法解决。
*/
#include<bits/stdc++.h>
using namespace std;
vector<int> path;
int sum;
int t ;
vector<int> nums;
void dfs(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();
    }
}
int main(){
    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);
    return 0;
}

14、字符串删除

/*
字符串删除,代码优化
	在一个数组是s1中删除含有s2的字串(这个应该是子数组,由于拿到手的资料是这样叙述的,暂时采用这个叙述),
	输出字串的个数,并且输出剩余的字符串
	eg:输入:ababababac
		  aba
	  输出:2
	       bbac
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
    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;
    return 0;
}
#include<bits/stdc++.h>
using namespace std;

int main(){
    string s1,s2,res;
    cin>>s1>>s2;
    int count = 0;
    for(int i  = 0,j =0 ;i < s1.size() ; i++){
        int start = i;
        j = 0 ;
        while(i<s1.size() && j<s2.size() && s1[i] ==s2[j]){
            i++;
            j++;
        }
        if(j == s2.size()){
            count++;
            i--;
        }else{
            res += s1[start];
            i = start;
            
        }
    }
    printf("%d\n",count);
    cout<<res;
    return 0;
}

15、字符串压缩

/*
字符串压缩,直接看实例。
	eg:aaabbcddddde
	  输出:3a2bc5de
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
    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;
    return 0;
}

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>
using namespace std ;

string ID;
int checkyear(int year){
    if(year % 400 == 0 || year % 4 == 0 && year % 100 != 0 )
        return 1;
    return 0;
}
int check(string ID){
    int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(ID.size() != 18) return 1;
    int year = stoi(ID.substr(6,4));
        if(year < 1990 || year > 2017 ) return 4;
    int month = stoi(ID.substr(10,2));
        if(month<0 || month > 12) return 5;
    int day = stoi(ID.substr(12,2));
    if(month!=2)
        if(day > months[month] || day == 0) return 6;
    else 
        if(day > months[month] + checkyear(year) || day == 0) return 6;
    
    for(int i = 0 ;i < 18 ;i ++){
        if(i < 17 && !isdigit(ID[i])) return 2;
        if(i == 17 && !isdigit(ID[i]) && ID[i] !='X') return 3;
    }
    return 0;//都没有问题,返回0
}


int main(){
    cin >> ID;
    cout << check(ID)<<endl;
    return 0;
}

17、判断是否是一个平方对称数

/*
	题意介绍:判断一个数是不是平方对称数,例如 11的平方是121,11是平方对称数,解释11的平方是对称数。
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
    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);
    }
    return 0;
}

18、表达式求值

/*
表达式求值,给你一个数学计算表达式,让你计算计算后的结果。
	eg:3*4
	输出:12
*/
#include<bits/stdc++.h>
using namespace std;
stack<int> nums;
stack<char> op;
void eval(){
    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;
    else if (c =='-') r = t1-t2;
    else if(c=='*') r = t1*t2;
    else r = t1/t2;
    nums.push(r);
}
int main(){
    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;
        }else if (s1[i] =='('){
            op.push(s1[i]);
        }else if(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());
    return 0;
}

19、判断出栈序列

/*
	给你一个已知的入栈序列,判断他是不是合法的出栈序列
		eg: 1 2 3 4 
			1 4 2 3为非法出栈序列
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    scanf("%d",&n);
    stack<int>st;
    vector<int> n1,n2;
    for(int i =1 ; i<=n ;i ++){
        n1.push_back(i);
    }
    for(int i = 0 ; i<n ;i++){
        int x;scanf("%d",&x);
        n2.push_back(x);
    }
    int i=0,j=0;
    for(i=0,j=0;i<n&&j<n;){
        st.push(n1[i]);
        while(st.size() && st.top()==n2[j]) {
            j++;
            st.pop();
        }
        i++;
    }
    printf("%s",j==n?"YES":"NO");
    return 0;
}

20、输出

/*
题意:输入一串字符串,其中的偶数从大到小,奇数从小到大,然后交叉输出,第一个输出奇数
解题思路:分成两个数字,排序,来一次合并操作。
*/
#include<bits/stdc++.h>
using namespace std ;
const int N = 2e5;//随意定义了一个数字
int j[N],o[N];
int n;
int main(){
    int x,n1 = 0 ,n2 = 0;
    while(cin >> x){
        if(x % 2) j[n1++] = x;// 是奇数
        else o[n2++] = x;//偶数
    }
    sort(j,j+n1);
    sort(o,o+n2);
    reverse(o,o+n2);
    int l = 0 , r = 0;
    while(l < n1 && r < n2){
        cout << j[l++]<<" ";
        cout << o[r++]<<" ";
    }
    // 合并剩余数字
    while(l < n1) cout << j[l++]<<" ";
    while(r < n2) cout << o[r++]<<" ";
    return 0;
}

21、英文语句倒置

/*
	直接看示例:
		输入:student. a am I
		输出:I am a student.
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
    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<<" ";
    }
    return 0;
}

22、哈夫曼树问题

/*
大概题意:给你个n,给你个数组,让你求合并后的最小值
*/
#include<bits/stdc++.h>
using namespace std ;

const int N = 1e5+10;
int n;
int q[N];

int main(){
    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;
    return 0;
}

23、神兽保佑代码:祝大家顺利上岸

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/
  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值