《算法笔记》第三章C++解题记录


1.简单模拟

  1. 简单模拟——1
#include<iostream>
using namespace std;
int main(){
    int n,roundNum=0;
    cin>>n;
    while(n!=1){
       roundNum++;
       if(n%2==0)   n/=2;
       else         n=(3*n+1)/2;
    }
    cout<<roundNum<<endl;
    return 0;
}
  1. 简单模拟——2
#include<iostream>
using namespace std;
int main(){
    int n,index,mark,maxIndex=0,maxMark=0;
    cin>>n;
    int record[n]={0};
    for(int i=0;i<n;i++){
        cin>>index>>mark;
        record[index-1]+=mark;
        if(record[index-1]>maxMark){
            maxMark=record[index-1];
            maxIndex=index;
        }
    }
    cout<<maxIndex<<" "<<maxMark<<endl;
    return 0;
}

2.查找元素

#include<iostream>
using namespace std;
int main(){
    int n,m;
    loop:while(cin>>n){
        int arr[n];
        for(int i=0;i<n;i++)    cin>>arr[i];
        cin>>m;
        for(int i=0;i<n;i++)
            if(arr[i]==m) {cout<<i<<endl; goto loop;}
        cout<<"-1"<<endl;
    }
    return 0;
}

3.图形输出

#include<iostream>
using namespace std;
int main(){
    int n,m;
    char c;
    cin>>n>>c;
    if(n%2==0)  m=n/2;
    else        m=n/2+1;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++)
            if(i==0||i==m-1) cout<<c;
            else
                if(j==0||j==n-1)    cout<<c;
                else                cout<<' ';
        cout<<endl;
    }
    return 0;
}

4.日期处理

碰到日期差值问题最一般的思路,就是从较小的日期开始每次加一天,当天数超过当前月份天数时月份加一,当月份数超过12时,年数加一。注意平年闰年。

#include<iostream>
#include<string>
using namespace std;
int arr[]={31,28,31,30,31,30,31,31,30,31,30,31};
int isLeapYear(int year){
    return (year%400==0||(year%4==0&&year%100!=0));
}
int main(){
    string s1,s2,temp;
    int y1,m1,d1,y2,m2,d2,result=1;
    cin>>s1>>s2;
    temp=s1;
    s1=s1<s2? s1:s2;
    s2=s1==temp? s2:temp;
    y1=stoi(s1.substr(0,4));
    y2=stoi(s2.substr(0,4));
    m1=stoi(s1.substr(4,2));
    m2=stoi(s2.substr(4,2));
    d1=stoi(s1.substr(6,2));
    d2=stoi(s2.substr(6,2));
    if(isLeapYear(y1))  arr[1]=29;
    else                arr[1]=28;
    while(y1<y2||m1<m2||d1<d2){
        if(d1<arr[m1-1])    d1++;
        else{
            d1=1;
            if(m1<12)   m1++;
            else{
                m1=1;
                y1++;
                if(isLeapYear(y1))  arr[1]=29;
                else                arr[1]=28;
            }
        }
        result++;
    }
    cout<<result<<endl;
    return 0;
}

5.进制转换

自己出了一个小题
要求:

  1. 通过输入函数标号0或1,与操作数num与radix。
  2. 当函数标号为0时,则将radix进制数num转换成10进制;
  3. 当函数标号为1时,则将10进制数num转换为radix进制。

注:数字中所有字母均为小写字母,当输入数字中有大写字母时自动转为小写字母。程序以输入ctrl+z结束。

#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
vector<int> v;
//10进制转radix进制
void trans10_radix(int num, int radix){
    v.clear();
    while(1){
        v.push_back(num%radix);
        num/=radix;
        if(num==0)  break;
    }
}
//radix进制转10进制
int transradix_10(string num, int radix){
    int result=0,e=1,current;
    for(int i=num.length()-1;i>=0;i--){
        char c=tolower(num[i]);
        if(c<='z'&&c>='a')  current=c-87;
        else                current=c-48;
        result+=current*e;
        e*=radix;
    }
    return result;
}
int main(){
    cout<<"输入0代表由给定进制转换到10进制;"<<endl;
    cout<<"输入1代表由10进制转换到给定进制;"<<endl;
    int cal;
    cout<<"请输入0或1: ";
    while(cin>>cal){
        cout<<"请输入操作数num与进制radix,用空格隔开: ";
        if(!cal){
            string num;
            int radix;
            cin>>num>>radix;
            cout<<"结果为:"<<transradix_10(num,radix)<<endl;
        }
        else{
            int num,radix;
            cin>>num>>radix;
            trans10_radix(num,radix);
            cout<<"结果为:";
            for(int i=v.size()-1;i>=0;i--)
                if(v[i]>=10)    cout<<(char)(v[i]+87);
                else            cout<<v[i];
            cout<<endl;
        }
        cout<<"请输入0或1: ";
    }
    return 0;
}

运行结果:

输入0代表由给定进制转换到10进制;
输入1代表由10进制转换到给定进制;
请输入0或1: 0
请输入操作数num与进制radix,用空格隔开: abc 17
结果为:3089
请输入0或1: 1
请输入操作数num与进制radix,用空格隔开: 3089 17
结果为:abc
请输入0或1: 0
请输入操作数num与进制radix,用空格隔开: ab1c 18
结果为:61914
请输入0或1: 1
请输入操作数num与进制radix,用空格隔开: 61914 18
结果为:ab1c
请输入0或1: ^Z

6.字符串处理

  1. 字符串处理——1
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main(){
    string str,str1;
    cin>>str;
    str1=str;
    reverse(str.begin(), str.end());
    if(str1==str)   cout<<"YES"<<endl;
    else            cout<<"NO"<<endl;
    return 0;
}
  1. 字符串处理——2
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
    vector<string> v;
    string word;
    while(cin>>word)    v.push_back(word);
    for(int i=v.size()-1;i>=0;i--)
        if(i==0)    cout<<v[i]<<endl;
        else        cout<<v[i]<<" ";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值