程序媛菜鸡之王道第二版机试指南算法实现

1.abc

数值转换。

#include<iostream>
using namespace std;

int main(){
    int a,b,c;
    for(a=1;a<10;a++)
        for(b=1;b<10;b++)
            for(c=0;c<10;c++)
                if((12*c+110*b+100*a)==532)
                    cout<<a<<" "<<b<<" "<<c<<endl;
}
2.反序数

数值转换题,枚举法。

#include<iostream>
using namespace std;

int main(){
    int a,b,c,d,num,num_t,num_r;
    for(a=1;a<10;a++)
        for(b=0;b<10;b++)
            for(c=0;c<10;c++)
                for(d=1;d<10;d++){
                    num = 1000*a+100*b+10*c+d;
                    num_r = 1000*d+100*c+10*b+a;
                    num_t = num*9;
                    if(num_t < 10000)
                        if(num_t == num_r)
                            cout<<num<<endl;
                }
}
3.对称平方数

数值转换,按位取余,两端判等,函数调用。

#include<iostream>
using namespace std;

bool equalNum(int n, int num){
    int s[n],i=0,j=0;
    while(num>0){
        s[i] = num % 10;
        num = num / 10;
        i++;
    }
    while(j < (n-1-j)){
        if(s[j] == s[n-1-j])
            j++;
        else
            return false;
    }
          return true;
}

int main(){
    int num,snum;
    for(num=0;num<=256;num++){
        snum = num*num;
        if(snum >= 10000){
            if(equalNum(5,snum))
                cout<<num<<endl;
        }else if(snum >= 1000){
            if(equalNum(4,snum))
                cout<<num<<endl;
        }else if(snum >= 100){
            if(equalNum(3,snum))
                cout<<num<<endl;
        }else if(snum >= 10){
            if(equalNum(2,snum))
                cout<<num<<endl;
        }else{
            cout<<num<<endl;
        }
    }
}
4.与7无关数

与7有关的条件取反且取交集。

#include<iostream>
using namespace std;

bool check(int num){
    while(num>0){
        if(num%10 != 7)
            num = num/10;
        else
            return false;
    }
    return true;
}

int main(){
    int n,sum=0;
    while(cin>>n){
        for(int i=1;i<=n;i++){
            if(i%7!=0 && check(i))
                sum += i*i;
        }
        cout<<sum<<endl;
    }
}
5.百鸡问题

难点就一个节省枚举数量的判断。

#include<iostream>
using namespace std;

int checkMax(int num){
    if(num>100)
        return 100;
    else
        return num;
}

int main(){
    int n,x,y,z;
    while(cin>>n)
        for(x = 0; x <= checkMax(n/5); x++)
            for(y = 0; y <= checkMax(n/3); y++)
                for(z = 0; z <= checkMax(3*n); z++){
                    float z_s;
                        z_s = ((float)z)/3;
                        if(x+y+z == 100 && (5*x+3*y+z_s) <= n)
                            cout<<"x="<<x<<",y="<<y<<",z="<<z<<endl;
                }
}
6.Old Bill

数学条件判断题,在无解时输出零处添加了一个布尔值判断,改变条件跳出双层嵌套循环。

#include<iostream>
using namespace std;

int main(){
    int n,x,y,z;
    int a,b,price;
    bool p_print;
    while(cin>>n){
        cin>>x>>y>>z;
        p_print = true;
        for(a=9;a>0;a--){
            for(b=9;b>=0;b--){
                price = 10000*a+1000*x+100*y+10*z+b;
                if(price % n == 0){
                    cout<<a<<" "<<b<<" "<<price/n<<endl;
                    p_print = false;
                    a=0;
                    b=-1;
                }
            }
        }
        
        if(p_print)
            cout<<"0"<<endl;
    }
}
7.Hello World for U

打印成U形,且越接近正方形越好,即将其转化为矩形的长短边,其字符串长度为N,除去U型重复使用的两个端点,以(N-2)%3的余数来确定矩形的边长a,b

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        int n,a,b;
        String str, blank=" ";
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            str = sc.nextLine();
            n = str.length();
            if((n-2)%3 == 0){
                a = (n-2)/3+1;
                b = (n-2)/3+2;
            }else if((n-2)%3 == 1){
                a = (n-2)/3+1;
                b = (n-2)/3+3;
            }else if((n-2)%3 == 2){
                a = (n-2)/3+2;
                b = (n-2)/3+2;
            }else{
                a = 0;
                b = 0;
            }
            for(int i=0; i<a-1; i++){
                for(int j=0; j<b; j++){
                    if(j==0)
                        System.out.print(str.charAt(i));
                    else if(j==(b-1))
                        System.out.print(str.charAt(n-1-i));
                    else
                        System.out.print(blank);
                }
                System.out.println();
            }
            for(int k=0; k<b; k++)
                System.out.print(str.charAt(a-1+k));
            System.out.println();
        }
    }
}
8.今年第几天

省去繁琐地判断月份的天数,直接用数组存储。

#include<iostream>
using namespace std;

int main(){
    int y,m,d,td;
    int n_y[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int abn_y[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    while(cin>>y>>m>>d){
        td = 0;
        if((y%4==0 && y%100!=0)||(y%400==0)){
            for(int i=0; i<m-1; i++)
                td += abn_y[i];
        }else{
            for(int i=0; i<m-1; i++)
                td += n_y[i];
        }
        td += d;
            cout<<td<<endl;
    }
}
9.打印日期

注意在判断输入的天数和每个月天数的比较,else要加break,否则在末尾几天会出现月份多加1的情况,原理同上。

#include<iostream>
using namespace std;

int main(){
    int y,m,d;
    int n_y[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int abn_y[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    while(cin>>y>>d){
        m = 1;
        if((y%4==0 && y%100!=0)||(y%400==0)){
            for(int i=0; i<12; i++){
                if(d>abn_y[i]){
                    d -= abn_y[i];
                    m++;
                }else
                    break;
            }
        }else{
            for(int i=0; i<12; i++){
                if(d>n_y[i]){
                    d -= n_y[i];
                    m++;
                }else
                    break;
            }
        }
        
        if(y<10)
            cout<<"000"<<y<<"-";
        else if(y<100)
            cout<<"00"<<y<<"-";
        else if(y<1000)
            cout<<"0"<<y<<"-";
        else
            cout<<y<<"-";
        
        if(m<10)
            cout<<"0"<<m<<"-";
        else
            cout<<m<<"-";
        
        if(d<10)
            cout<<"0"<<d<<endl;
        else
            cout<<d<<endl;
    }
}
10.日期类

C++中include调用scanf和printf的stdio头文件,%2d表示对齐,%02d表示不足位补零;
考虑跨月份、跨年份时间发生;
第九题中,如果使用cout输出流的话补位十分繁琐,故我用的是比较笨的方法,与第十题作对比。

#include<iostream>
#include<stdio.h>
using namespace std;

int main(){
    int m;
    cin>>m;
    
    int mmdd[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int yy,mm,dd;
    for(int i=0;i<m;i++){
        cin>>yy>>mm>>dd;
        if(mm==12 && dd == mmdd[11]){
            yy += 1;
            mm = 1;
            dd = 1;
        }else if(dd == mmdd[mm-1]){
            mm += 1;
            dd = 1;
        }else
            dd += 1;
        
        printf("%04d-%02d-%02d\n",yy,mm,dd);
    }
}
11.日期差值

千万记得题目的要求是天数间隔是差值+1,转换成当年的第几天,然后再算相差天数。

#include<iostream>
using namespace std;

bool leapYear(int y){
    if((y%4==0 && y%100!=0)||y%400==0)
        return true;
    else
        return false;
}

int numDay(int y, int m, int d){
    int td=0;
    int nleap[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int leap[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
    if(leapYear(y))
        for(int i=0; i<m-1; i++)
            td += leap[i];
    else
        for(int i=0; i<m-1; i++)
            td += nleap[i];
    
    td += d;
    return td;
}

void gapDay(int y1, int y2, int d1, int d2){
    int y,gd;
    y = y1-y2;//Make sure the biggest one is y1/d1
    
    if(y == 0){
        gd = d1-d2+1;
    }else{
        if(leapYear(y2))
            gd = (366-d2) + (y-1)*365 + y/4 + d1 + 1;
        else
            gd = (365-d2) + (y-1)*365 + y/4 + d1 + 1;
    }
    cout<<gd<<endl;
}

int main(){
    int d1,d2;
    int p1,p2;
    int y1,y2,m1,m2,n1,n2;
    while(cin>>d1>>d2){
        y1 = d1/10000;
        y2 = d2/10000;
        m1 = (d1 - y1*10000)/100;
        m2 = (d2 - y2*10000)/100;
        n1 = d1 - y1*10000 - m1*100;
        n2 = d2 - y2*10000 - m2*100;
        p1 = numDay(y1,m1,n1);
        p2 = numDay(y2,m2,n2);
        
        if(d1>d2)
            gapDay(y1,y2,p1,p2);
        else
            gapDay(y2,y1,p2,p1);
    }
}
12.剩下的树

比较粗暴,想过拆分数组的方法,但是可能输入的区间重复率低,拆分出的区间个数太多(我自己水平不够)还是需要通过数组实现,就还是采用的标志位方法。

#include<iostream>
using namespace std;

int main(){
    int l,m,a,b,leftT;
    while(cin>>l>>m){
        leftT = l+1;
        int tree[l+1];
        for(int i=0; i<l+1; i++)
            tree[i] = 0;
        
        for(int i=0; i<m; i++){
            cin>>a>>b;
            for(int j=a; j<b+1; j++){
                if(tree[j] == 0){
                    leftT--;
                    tree[j] = 1;
                }
            }
        }
        
        cout<<leftT<<endl;
    }
}
13.日期累加

我必须喷一下某些题的用例,属实故障+智障。
(某人检查过后,发现是我自己少打了一个换行符 = = dbq)
这个题其实有挺多种解法,我个人认为比较简单的一种是:累加天数减掉之后每个月的天数,直到剩下的累加天数能够停留在一个月内。

#include<iostream>
#include<cstdio>
using namespace std;

bool leapYear(int y){
    if((y%4==0 && y%100!=0)||y%400==0)
        return true;
    else
        return false;
}

void nowDay(int y, int m, int d, int pd){
    int ly[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
    int nly[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    while(pd>0){
        if(leapYear(y)){
            if(pd<=ly[m-1]-d){
                d += pd;
                printf("%04d-%02d-%02d\n",y,m,d);
                break;
            }else{
                pd = pd-(ly[m-1]-d+1);
                if(m<12)
                    m++;
                else{
                    y++;
                    m = 1;
                }
                d = 1;
            }
        }else{
            if(pd<=nly[m-1]-d){
                d += pd;
                printf("%04d-%02d-%02d\n",y,m,d);
                break;
            }else{
                pd = pd-(nly[m-1]-d+1);
                if(m<12)
                    m++;
                else{
                    y++;
                    m = 1;
                }
                d = 1;
            }
        }
    }
}

int main(){
    int n;
    cin>>n;
    int y,m,d,pd;
    for(int i=0; i<n; i++){
        cin>>y>>m>>d>>pd;
        nowDay(y,m,d,pd);
    }
}
14.Day of week

case通过率只有85%,不知道为什么……(可能是我算法太复杂了?)
我的想法是,以当天为标志,判断日期差值,然后根据前后且%7的值,判断周几(但不知道为什么到2101年会多一天……)
欢迎看出问题的大佬可以告诉我……

#include<iostream>
#include<cstdio>
using namespace std;

bool leapYear(int y){
    if((y%4==0&&y%100!=0)||y%400==0)
        return true;
    else
        return false;
}

int convertMonth(string m){
    if(m == "January")
        return 1;
    else if(m == "February")
        return 2;
    else if(m == "March")
        return 3;
    else if(m == "April")
        return 4;
    else if(m == "May")
        return 5;
    else if(m == "June")
        return 6;
    else if(m == "July")
        return 7;
    else if(m == "August")
        return 8;
    else if(m == "September")
        return 9;
    else if(m == "October")
        return 10;
    else if(m == "November")
        return 11;
    else if(m == "December")
        return 12;
    else
        return 0;
    //solve the warning
}

string convertWeekday(int weekday, bool before){
    if(before){
        switch(weekday){
                //2020.3.7 is Saturday
            case 5: return "Monday";
            case 4: return "Tuesday";
            case 3: return "Wednesday";
            case 2: return "Thursday";
            case 1: return "Friday";
            case 0: return "Saturday";
            case 6: return "Sunday";
        }
    }else{
        switch(weekday){
            case 2: return "Monday";
            case 3: return "Tuesday";
            case 4: return "Wednesday";
            case 5: return "Thursday";
            case 6: return "Friday";
            case 0: return "Saturday";
            case 1: return "Sunday";
        }
    }
}

int calDay(int y, int m, int d){
    int lpy[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
    int nlpy[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if(leapYear(y))
        for(int i=0;i<m-1;i++)
            d += lpy[i];
    else
        for(int j=0;j<m-1;j++)
            d+= nlpy[j];
    return d;
}

int main(){
    int d,y;
    string m;
    int nowd,testd;
    while(cin>>d>>m>>y){
        nowd = calDay(2020,3,7);//Set today as the target
        testd = calDay(y,convertMonth(m),d);
        if(y<2020){
            if(leapYear(y)){
                nowd += 366-testd+(2020-y-1)*365+(2020-y)/4;
            }else{
                nowd += 365-testd+(2020-y-1)*365+(2020-y)/4;
            }
            cout<<convertWeekday(nowd%7,true)<<endl;
        }else if(y == 2020){
            if(testd>nowd)
                cout<<convertWeekday((testd-nowd)%7,false)<<endl;
            else
                cout<<convertWeekday((nowd-testd)%7,true)<<endl;
        }
        else{
            testd += 366-nowd+(y-2020-1)*365+(y-2020)/4;
            cout<<convertWeekday(testd%7,false)<<endl;
        }
    }
}
15.Grading

分情况讨论,输出时注意保留一位小数。

#include<iostream>
#include<cstdio>
using namespace std;

int getDif(int a, int b){
    if(a-b>=0)
        return a-b;
    else
        return b-a;
}

int getMax(int a, int b, int c){
    if((a>b && b>c)||(a>c && c>b))
        return a;
    else if((b>a && a>c)||(b>c && c>a))
        return b;
    else
        return c;
}

int main(){
    int p,t,g1,g2,g3,gj;
    while(cin>>p>>t>>g1>>g2>>g3>>gj){
        if(getDif(g1,g2)<=t){
            printf("%.1f",((float)g1+g2)/2);
            continue;
        }else if(getDif(g1,g3)<=t && getDif(g2,g3)>t){
            printf("%.1f",((float)g1+g3)/2);
            continue;
        }else if(getDif(g2,g3)<=t && getDif(g1,g3)>t){
            printf("%.1f",((float)g1+g3)/2);
            continue;
        }else if(getDif(g2,g3)<=t && getDif(g1,g3)<=t){
            printf("%.1d",getMax(g1,g2,g3));
        }else if(getDif(g2,g3)>=t && getDif(g1,g3)>=t){
            printf("%.1d",gj);
        }
    }
}
16.排序

这道题用来复习各种排序算法的实现。

这一部分的代码也会更新在数据结构部分。

1)直接插入排序
#include<iostream>
#include<cstdio>
using namespace std;

int main(){
    int n,tag,temp;
    while(cin>>n){
        //InsertSort seems like the best choice
        int num[n];
        for(int i=0; i<n; i++){
            cin>>num[i];
            tag = i;
            while(tag>0){
                if(num[tag]<num[tag-1]){
                    temp = num[tag-1];
                    num[tag-1] = num[tag];
                    num[tag] = temp;
                    tag--;
                }else
                    break;
            }
        }
        
        for(int i=0; i<n; i++)
            cout<<num[i]<<" ";
        
        cout<<endl;
    }
}
2)冒泡排序

马泡泡排序,注意swap不要写错了。

#include<iostream>
#include<cstdio>
using namespace std;

int main(){
    int n,temp;
    bool change;
    while(cin>>n){
        //InsertSort seems like the best choice
        int num[n];
        for(int i=0;i<n;i++)
            cin>>num[i];
        
        change = true;
        for(int i=0; i<n-1; i++){
            if(change){
                change = false;
                for(int j=0; j<n-i-1; j++){
                    if(num[j]>num[j+1]){
                        temp = num[j];
                        num[j] = num[j+1];
                        num[j+1] = temp;
                        change = true;
                    }
                }
            }else
                break;
        }
        
        for(int i=0; i<n; i++)
            cout<<num[i]<<" ";
        
        cout<<endl;
    }
}
3)快速排序

分治法。(但本题其实插排最好,可以边输入边排序)

#include<iostream>
#include<cstdio>
using namespace std;

int tagPos(int num[], int low, int high){
    int tag = num[low];
    while(low<high){
        while(low<high && num[high]>tag)
            high--;
        num[low]=num[high];
        while(low<high && num[low]<tag)
            low++;
        num[high]=num[low];
    }
    num[low]=tag;
    return low;
}

void QuickSort(int num[], int low, int high){
    if(low<high){
        int tl;
        tl = tagPos(num,low,high);
        QuickSort(num,low,tl-1);
        QuickSort(num,tl+1,high);
    }
}

int main(){
    int n,tag,low,high,temp;
    while(cin>>n){
        //InsertSort seems like the best choice
        int num[n];
        for(int i=0;i<n;i++)
            cin>>num[i];
        
        QuickSort(num,0,n-1);
        
        for(int i=0; i<n; i++)
            cout<<num[i]<<" ";
        cout<<endl;
    }
}
4)algorithm库(c++)

c++的库中自带快排sort(起址,终址,升降序),要注意的是arr表传址,arr[0]表传值。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
    int n,tag,temp;
    while(cin>>n){
        //InsertSort seems like the best choice
        int num[n];
        for(int i=0; i<n; i++)
            cin>>num[i];
        
        sort(num,num+n);
        
        for(int i=0; i<n; i++)
            cout<<num[i]<<" ";
        
        cout<<endl;
    }
}
17.成绩排序1

多个一维数组或多维数组联动时,快排的条件最好是用组合条件来判断是否需要交换。

#include<iostream>
#include<algorithm>
using namespace std;

//Try to write down the quicksort again
int getPos(int n[],int m[],int low,int high){
    int tag1 = n[low],tag2 = m[low];
    while(low<high){
        while(low<high && tag1<n[high])
            high--;
        n[low]=n[high];
        m[low]=m[high];
        while(low<high && tag1>n[low])
            low++;
        n[high]=n[low];
        m[high]=m[low];
    }
    n[low]=tag1;
    m[low]=tag2;
    return low;
}

void QuickSort(int n[],int m[],int low,int high){
    if(low<high){
        int tl = getPos(n,m,low,high);
        QuickSort(n,m,low,tl-1);
        QuickSort(n,m,tl+1,high);
    }
}

int main(){
    //two arrays
    int n;
    cin>>n;
    int student[n];
    int grade[n];
    
    for(int i=0; i<n; i++)
        cin>>student[i]>>grade[i];
    QuickSort(grade,student,0,n-1);
    
    int low,high;
    for(int i=0; i<n; i++){
        if(grade[i]!=grade[i+1] && i+1<n)
            cout<<student[i]<<" "<<grade[i]<<endl;
        else if(i==n-1)
            cout<<student[i]<<" "<<grade[i]<<endl;
        else{
            low = i;
            i++;
            while(grade[i]==grade[i+1] && i+1<n)
                i++;
            if(i==n-1 && grade[i]==grade[i-1]){
                sort(student+low,student+n);
                for(int j=low; j<n; j++)
                    cout<<student[j]<<" "<<grade[low]<<endl;
                break;
            }else{
                sort(student+low,student+i-1);
                for(int j=low; j<i; j++)
                    cout<<student[j]<<" "<<grade[low]<<endl;
                i--;
            }
        }
    }
    
}

另,本题使用数据结构解题则代码体更简洁。

#include<iostream>
using namespace std;

typedef struct student{
    int no;
    int grade;
}student;

int main(){
    int num;
    while(cin>>num){
        student p[num];
        for(int i=0;i<num;i++)
            cin>>p[i].no>>p[i].grade;
        
        student temp;
        bool swap = true;
        for(int i=0;i<num-1;i++){
            if(swap){
                swap = false;
                for(int j=0;j<num-i-1;j++){
                    if(p[j].grade>p[j+1].grade || (p[j].grade==p[j+1].grade && p[j].no>p[j+1].no)){
                        temp = p[j];
                        p[j] = p[j+1];
                        p[j+1] = temp;
                        swap = true;
                    }
                }
            }
        }
        
        for(int i=0;i<num;i++)
            cout<<p[i].no<<" "<<p[i].grade<<endl;
    }
}
18.成绩排序2

由于题中没有明确说一次输入多个测试用例,惯性思维导致我一直没有判断是否有继续输入。
本题即采用typedef struct自定义数据结构实现同步排序。

#include<iostream>
using namespace std;

typedef struct student{
    string name;
    int grade;
}student;

void sortASC(student s[], int num){
    student temp;
    bool swap = true;
    for(int j=0;j<num-1;j++){
        if(swap){
            swap = false;
            for(int i=0;i<num-1-j;i++){
                if(s[i].grade > s[i+1].grade){
                    temp = s[i];
                    s[i] = s[i+1];
                    s[i+1] = temp;
                    swap = true;
                }
            }
        }
    }
}

void sortDESC(student s[], int num){
    student temp;
    bool swap = true;
    for(int j=0;j<num-1;j++){
        if(swap){
            swap = false;
            for(int i=num-1;i>j;i--){
                if(s[i].grade > s[i-1].grade){
                    temp = s[i];
                    s[i] = s[i-1];
                    s[i-1] = temp;
                    swap = true;
                }
            }
        }
    }
}

int main(){
    int num, way;
    
    while(cin>>num>>way){
        student p[num];
        for(int i=0;i<num;i++)
            cin>>p[i].name>>p[i].grade;
        
        if(way==0)
            sortDESC(p,num);
        
        if(way==1)
            sortASC(p,num);
        
        for(int i=0;i<num;i++)
            cout<<p[i].name<<" "<<p[i].grade<<endl;
    }
}

当然algorithm库中的sort函数也支持升降序,但自定义数据结构无法单独将grade部分的地址独立出来从而形成连续地址进行处理。

19.特殊排序

首先这道题,我感觉应该想考察去重+部分输出,所以将所有最大值去掉然后输出的实现代码如下。(不是本题解!不是本题解!)

#include<iostream>
using namespace std;

int main(){
    int num;
    while(cin>>num){
        int n[num];
        int max = 0;
        for(int i=0;i<num;i++){
            cin>>n[i];
            if(max<n[i])
                max = n[i];
        }
        cout<<max<<endl;
        
        int count = num;
        for(int i=0;i<num;i++)
            if(n[i]==max)
                count--;
        
        if(count==0){
            cout<<-1<<endl;
        }else{
            int temp;
            bool swap = true;
            for(int i=0;i<num-1;i++){
                if(swap){
                    swap = false;
                    for(int j=0;j<num-i-1;j++){
                        if(n[j]>n[j+1]){
                            temp = n[j];
                            n[j] = n[j+1];
                            n[j+1] = temp;
                            swap = true;
                        }
                    }
                }
            }
            
            for(int i=0;i<count;i++)
                cout<<n[i]<<" ";
            
            cout<<endl;
        }
    }
}

然后是这道题的解,其实更加简单了一些,感觉是考察冒泡。

#include<iostream>
using namespace std;

int main(){
    int num;
    while(cin>>num){
        int n[num];
        for(int i=0;i<num;i++)
            cin>>n[i];
        
        int temp;
        bool swap = true;
        for(int i=0;i<num-1;i++){
            if(swap){
                swap = false;
                for(int j=0;j<num-i-1;j++){
                    if(n[j]>n[j+1]){
                        temp = n[j];
                        n[j] = n[j+1];
                        n[j+1] = temp;
                        swap = true;
                    }
                }
            }
        }
        
        cout<<n[num-1]<<endl;
        if(num-1==0){
            cout<<-1<<endl;
        }else{
            for(int i=0;i<num-1;i++)
                cout<<n[i]<<" ";
            cout<<endl;
        }
    }
}
20.整数奇偶排序

暴力输出。

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
    int num[10];
    while(cin>>num[0]>>num[1]>>num[2]>>num[3]>>num[4]>>num[5]>>num[6]>>num[7]>>num[8]>>num[9]){
        sort(num,num+10);
        for(int i=9;i>=0;i--)
            if(num[i]%2!=0)
                cout<<num[i]<<" ";
        
        for(int i=0;i<10;i++)
            if(num[i]%2==0)
                cout<<num[i]<<" ";
    }
}
21.小白鼠排序

考察数据结构。

#include<iostream>
using namespace std;

typedef struct mouse{
    int weight;
    string hat;
}mouse;

int main(){
    int n;
    while(cin>>n){
        mouse m[n];
        for(int i=0;i<n;i++)
            cin>>m[i].weight>>m[i].hat;
        
        mouse temp;
        bool swap = true;
        for(int i=0;i<n-1;i++){
            if(swap){
                swap = false;
                for(int j=n-1;j>i;j--){
                    if(m[j].weight>m[j-1].weight){
                        temp = m[j];
                        m[j] = m[j-1];
                        m[j-1] = temp;
                        swap = true;
                    }
                }
            }
        }
        
        for(int i=0;i<n;i++)
            cout<<m[i].hat<<endl;
    }
}
22.查找

有序数列折半查找算法。

#include<iostream>
#include<algorithm>
using namespace std;

void quicksort(int a[], int low, int high){
    int tag, left, right;
    if(low<high){
        left = low;
        right = high;
        tag = a[low];
        while(low<high){
            while(a[high]>tag && low<high)
                --high;
            a[low] = a[high];
            while(a[low]<tag && low<high)
                low++;
            a[high] = a[low];
            a[low] = tag;
        }
        quicksort(a,left,low-1);
        quicksort(a,low+1,right);
    }
}

bool findX(int a[], int low, int high, int tag){
    int half = (low+high)/2;
    if(low<=high){
        if(tag == a[half])
            return true;
        else if(tag < a[half])
            return findX(a,low,half-1,tag);
        else if(tag > a[half])
            return findX(a,half+1,high,tag);
    }else 
        return false;
}

int main(){
    int n,m;
    while(cin>>n){
        int a[n];
        for(int i=0;i<n;i++)
            cin>>a[i];
        
        sort(a,a+n);
        //quicksort(a,0,n-1);
        
        cin>>m;
        int input;
        for(int i=0;i<m;i++){
            cin>>input;
            
            if(findX(a,0,n-1,input))
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
}
23. 浮点数加法

一开始看错题了,给个抽象表达式我以为是等位数加法,没有考虑对齐,实现如下:

#include <iostream>
#include <string>
//#include <vector>
using namespace std;

int main(){
    string a,b;
    //vector<string> result;
    int add,lastAdd;
    
    while(cin>>a>>b){
        add=0,lastAdd=0;
        for(int i=a.size()-1;i>=0;i--){
            if(a[i] != '.'){
                add = (a[i] - '0') + (b[i] - '0') + lastAdd;
                a[i] = (char)((add % 10) + '0');
                lastAdd = add/10;
            }
        }
        
        if(lastAdd!=0)
            cout<<lastAdd<<a<<endl;
            // a = lastAdd.toString + a;
        else
            cout<<a<<endl;
    }
}

等位加减的难点在于char与int的转换,同时cpp中可以对string的每一位做变换(虽然本质也是重新创建新string)但java只能访问不可操作。int作为char插入时,要加上基础char值。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值