天梯赛做题小技巧总结

目录

目录

一、字符串中的单个字符转换成整型数字

二、用vector整行输入整数

三、素数判断(1要单独判断)

四、C++ set,setfill(),setw()的用法

五、vector的应用

L1-035 情人节 (15 分)

六、C++保留两位小数输出

L1-037 A除以B (10 分)

七、四舍五入和memset函数

L1-043 阅览室 (20 分)

八、完全由小写英文字母组成的字符串等差递增序列,与十进制相比较将其转化为26进制

L1-050 倒数第N个字符串 (15 分)

九、数组整行输入

L1-048 矩阵A乘以B (15 分)

十、竖式除法的程序实现

L1-046 整除光棍 (20 分)

十一、数组求和库函数accumulate()和绝对值函数abs() 

L1-056 猜数字 (20 分)

 十二、输入字符串时,把空格也录进去,cout<<"27";才能输出27,cout<<'27'输不出27

L1-058 6翻了 (15 分)

十三、判断string字符串是否含有某个子串

L1-070 吃火锅 (15 分)

十四、二进制转成十进制

L1-071 前世档案 (20 分) 

十五、递归求最大公约数

L1-009 N个数求和 (20 分)

十六、C++STL之无序set

L1-011 A-B (20 分) 

十七、C++ set 

L1-033 出生年 (15 分)

 十八、C中 %d 和 %04d 和%-4d有什么区别?

 十九、C++之unordered_map

L1-044 稳赢 (15 分)


一、L1--016

一、字符串中的单个字符转换成整型数字

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,sum = 0,count=0;
    int z[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char m[]={'1','0','X','9','8','7','6','5','4','3','2'};
    cin>>n;
    string id[n];
    int result[n];
    for(int i = 0;i<n;i++)
        cin>>id[i];
    for(int i = 0;i<n;i++){
        sum = 0;           //细节不要忘记
        for(int j = 0;j<17;j++){
            sum += z[j]*int(id[i][j] - '0');//字符串中的单个字符转换成整型数字
        }
        result[i] = sum%11;
        if(id[i][17]!=m[result[i]]){
            count++;
            cout<<id[i]<<endl;
        }
    }
    
    if(count==0)
        cout<<"All passed";
}

二、用vector整行输入整数

L1-022 奇偶分家 (10 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,b;
    cin>>n;
    int odd=0,even = 0;
    vector<int> num;
    while(n--){    //这里开始
        cin>>b;
        num.push_back(b);
        if(cin.get()=='\n')
            break;
    }
    for(int i = 0;i<num.size();i++){
        if(num[i]%2==0)
            even++;
        else
            odd++;
    }
    cout<<odd<<' '<<even;
    return 0;
}

三、素数判断(1要单独判断)

L1-028 判断素数 (10 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    int a[n];
    bool flag;
    string result[n];
    for(int i = 0;i<n;i++)
        cin>>a[i];
    for(int i = 0;i<n;i++){
        flag = true;
        if(a[i] == 1){            //1要单独拿出来进行判断,如果是1,那肯定不是素数
            result[i] = "No";
            continue;
        }
        if(a[i] == 2){            //单独判断2
            result[i] = "Yes";
            continue;            
        }
        for(int j = 2;j<=sqrt(a[i]);j++){
            if(a[i]%j==0){
                result[i] = "No";
                flag = false;
                break;
            }
        }
        if(flag)
            result[i] = "Yes";
    }
    for(int i = 0;i<n;i++)
        cout<<result[i]<<endl;
    return 0;
}

四、C++ set,setfill(),setw()的用法

L1-033 出生年 (15 分)

在C++中,setw(int n)用来控制输出间隔。
例如:
cout<<'s'<<setw(8)<<'a'<<endl;
则在屏幕显示
s        a 
//s与a之间有7个空格,加上a就8个位置,setw()只对其后面紧跟的输出产生作用,如上例中,表示'a'共占8个位置,不足的用空格填充。若输入的内容超过setw()设置的长度,则按实际长度输出
setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。
如:
cout<<setfill('*')<<setw(5)<<'a'<<endl;
则输出:
****a //4个*和字符a共占5个位置。
 


关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。 

#include<bits/stdc++.h>
using namespace std;

int main(){
    int year,n;
    cin>>year>>n;
    for(int i = year;i<4000;i++){
        set<int> b;	
        int num = i;
        for(int j = 0;j<4;j++){
            b.insert(num%10);
            num /= 10;
        }
        if(b.size() == n){
            cout<<i - year<<' '<<setfill('0')<<setw(4)<<i;
            break;
        }
    }
    return 0;
}

五、vector的应用

L1-035 情人节 (15 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<string> name;
    string a;
    while(true){
        cin>>a;
        getchar();
        if(a!=".")
            name.push_back(a);
        else
            break;
    }
    if(name.size()>=15)
        cout<<name[1]<<" and "<<name[13]<<" are inviting you to dinner...";
    else if(name.size()>=2)
        cout<<name[1]<<" is the only one for you...";
    else
        cout<<"Momo... No one is for you ...";
    return 0;
    
}

六、C++保留两位小数输出

L1-037 A除以B (10 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    double a,b,result;
    cin>>a;
    getchar();
    cin>>b;
    
    if(b==0)
        cout<<a<<'/'<<b<<'='<<"Error";
    else if(b < 0)
        cout<<a<<"/("<<b<<")="<<fixed<<setprecision(2)<<a/b;
    else
        cout<<a<<'/'<<b<<'='<<fixed<<setprecision(2)<<a/b;
    return 0;
}

七、四舍五入和memset函数

L1-043 阅览室 (20 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,count=0,m,hh,mm,map[1001]={0},min[1001] = {0};
    double sum = 0;
    char b,c;
    cin>>n;
    while(n>0){
        cin>>m>>c>>hh>>b>>mm;
        if(m==0){
            cout<<count<<' ';
            if(count == 0)
                cout<<0<<endl;
            else{
                printf("%.0f\n",sum/count);    //"%.0f",小数位四舍五入,取整数位
            }
            n--;
            sum = 0;
            memset(map,0,sizeof(map));    
            count = 0;
        }
        else if(c == 'S'){
            map[m] = 1;
            min[m] = hh*60+mm;
        }
        else if(c == 'E'&&map[m] == 1){
            sum += (hh*60+mm - min[m]);
            map[m] = 0;
            count++;
        }
    }
    return 0;
}

每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:

# include <string.h>
void *memset(void *s, int c, unsigned long n);

函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

八、完全由小写英文字母组成的字符串等差递增序列,与十进制相比较将其转化为26进制

L1-050 倒数第N个字符串 (15 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int l,n,sum;
    cin>>l>>n;
    sum = pow(26,l);    //指数函数,pow(x,y):x的y次幂
    int qure = sum - n;
    char count[l];
    for(int i = l-1;i>=0;i--){
        count[i] = qure%26+'a';        //与十进制相比可以将其看成26进制的数字,最小数是a对应十进制的0
        qure /= 26;
    }
    for(int i = 0;i<l;i++)
        cout<<count[i];
    return 0;
}

九、数组整行输入

L1-048 矩阵A乘以B (15 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int row1,col1,row2,col2,temp = 0;
    cin>>row1>>col1;
    int A[row1][col1];
    for(int i = 0;i<row1;i++){
        for(int j = 0;j<col1;j++)
            cin>>A[i][j];            //数组可以采用两层for循环整行输入
    }
 
    cin>>row2>>col2;
    int B[row2][col2];
    for(int i = 0;i<row2;i++){
        for(int j = 0;j<col2;j++)
            cin>>B[i][j];

    }
    if(col1 != row2){
        cout<<"Error: "<<col1<<" != "<<row2;
        return 0;
    }
    
    int result[row1][col2];
    for(int k = 0;k<col2;k++){
        for(int i = 0;i<row1;i++){
            for( int j = 0;j<col1;j++){
                 temp += A[i][j]*B[j][k];
            }
            result[i][k]=temp;
            temp = 0;
        }
    }
    
    cout<<row1<<' '<<col2<<endl;
    for(int i = 0 ;i<row1;i++){
        cout<<result[i][0];
        for(int k = 1;k<col2;k++)
            cout<<' '<<result[i][k];
        cout<<endl;
    }

}

十、竖式除法的程序实现

L1-046 整除光棍 (20 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int x,n=1;
    int i = 1;
    cin>>x;
    for(;i<x;){
        i = i*10+1;
        n++;
    }
    while(1){
        cout<<i/x;
        i = i%x;
        if(i == 0)
            break;
        else{
            i = i*10+1;
            n++;
        }
    }
    cout<<' '<<n;
    return 0;
}

十一、数组求和库函数accumulate()和绝对值函数abs() 

L1-056 猜数字 (20 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,ave,sum,min,pos,temp;
    cin>>n;
    string name[n];
    int num[n];
    
    for(int i = 0;i<n;i++)
        cin>>name[i]>>num[i];
    sum = accumulate(num,num+n,0);
    ave = (sum/n)/2;
    
    min = abs(num[0] - ave);
    pos = 0;
    for(int i = 1;i<n;i++){
        temp = abs(num[i] - ave);
        if(temp<min){
            min = temp;
            pos = i;
        }
            
    }
    cout<<ave<<' '<<name[pos];
    return 0;
}

accumulate函数将一段数字从头到尾累加起来,或者使用指定的运算符进行运算
accumulate函数的前两个参数指定累加的范围,第三个参数为累加的初值,第四个参数为进行的操作,默认为累加
使用accumulate要添加#include<numeric>

#include<iostream>
#include<vector>
#include<numeric>
using namespace std;

int main() {

    vector<int> nums = {1, 2, 3, 4, 5};
    int result = accumulate(nums.begin(), nums.end(), 0);
    cout << result << endl;
    
    return 0;
}

 十二、输入字符串时,把空格也录进去,cout<<"27";才能输出27,cout<<'27'输不出27

L1-058 6翻了 (15 分)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int count,i=0;
    string a;
    getline(cin,a);    //这种方法可以录入空格
    while(i<a.length()){
        if(a[i]!='6'){
            cout<<a[i];
            i++;
        }
        else{
            count = 0;
            while(1){
                count++;
                i++;
                if(a[i] != '6')
                    break;
            }
            if(count>3&&count<=9)
                cout<<'9';
            else if(count>9)
                cout<<"27";
            else if(count <= 3){
                for(int j = i-count;j<i;j++)
                    cout<<a[j];
            }
        }
    }
    return 0;
}

十三、判断string字符串是否含有某个子串

L1-070 吃火锅 (15 分)

char *jsonData = "abcdefg";
string str = "abc";
string jsonString = jsonData;//将char *转为string类型
if(jsonString.find(str) < jsonString.length())
{
    //表示str是jsonData的一个子字符串
}else
{

}
#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<string> mess;
    string a;
    string b = "chi1 huo3 guo1";
    int t = 0,pos;
    while(1){
        getline(cin,a);
        if(a == ".")
            break;
        mess.push_back(a);
    }
    for(int i = 0;i<mess.size();i++){
        if(mess[i].find(b)<mess[i].size()){  //判断字符串b在不在当前字符串内
            if(t==0)
                pos = i+1;
            t++;
        }
    }
    cout<<mess.size()<<endl;
    if(t != 0)
        cout<<pos<<' '<<t;
    else
        cout<<"-_-#";
    return 0;
}

十四、二进制转成十进制

L1-071 前世档案 (20 分) 

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,m,i,num;
    cin>>n>>m;
    string a[m];
    for(i = 0;i<m;i++)
        cin>>a[i];
    string bin="";   //二进制数
    for(i = 0;i<m;i++){
        bin="";
        num = 0;
        for(int j = 0;j<n;j++){
            if(a[i][j] == 'y')
                bin += "0";
            else
                bin += "1";   
        }
        for(int k=0;k<n;k++){
            if(bin[k] == '1')
                 num += pow(2,n-k-1);  //这里考虑好二进制转化成十进制公示里面i和次方的关系 
        }
            
        cout<<(num+1)<<endl;
    }
    return 0;
}
    

十五、递归求最大公约数

L1-009 N个数求和 (20 分)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll gcd(ll a,ll b){
    return (b==0) ? a:gcd(b,a%b);    //求最大公约数
}

十六、C++STL之无序set

L1-011 A-B (20 分) 

unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。

总的来说,unordered_set 容器具有以下几个特性:

  1. 不再以键值对的形式存储数据,而是直接存储数据的值;
  2. 容器内部存储的各个元素的值都互不相等,且不能被修改。
  3. 不会对内部存储的数据进行排序 

C++ STL unordered_set容器完全攻略 (biancheng.net)

#include<bits/stdc++.h>
using namespace std;
unordered_set<char> str_b;

int main(){
    string a,b;
    getline(cin,a);
    getline(cin,b);
    
    for(int i = 0;i<b.length();i++)
        str_b.insert(b[i]);
    for(int i = 0;i<a.length();i++){
        if(!str_b.count(a[i]))
            printf("%c",a[i]);
    }
    return 0;
}

十七、C++ set 

L1-033 出生年 (15 分)

标准库提供set关联容器分为:

1,按关键字有序保存元素:set(关键字即值,即只保存关键字的容器);multiset(关键字可重复出现的set);

2,无序集合:unordered_set(用哈希函数组织的set);unordered_multiset(哈希组织的set,关键字可以重复出现)。

set就是关键字的简单集合。当只是想知道一个值是否存在时,set是最有用的。

在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。set中元素的值不能直接被改变。set内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树。

set具备的两个特点:

set中的元素都是排序好的
set中的元素都是唯一的,没有重复的

(156条消息) C++ set用法总结(整理)_sevencheng798的博客-CSDN博客_c++ set

 十八、C中 %d 和 %04d 和%-4d有什么区别?

%d左对齐,输出变量的所有数字;

%4d右对齐,宽度为4,左边填充空格, 当变量的实际宽度大于4时,输出变量的所有数字;

%04d与%4d的唯一区别就是左边填充0。

%-4d意思是数字占四位、左对齐。

```c 比如, 1.以%d,%4d,%04d,输出12时,结果是:

12

两个空格12

0012

2.以%d,%4d,%04d,输出123时,结果是:

123

一个空格123

0123 3.

以%d,%4d,%04d,输出1234时,结果是:

1234

1234

1234

4.以%d,%4d,%04d,输出12345时,结果是:

12345

12345

12345

 十九、C++之unordered_map

L1-044 稳赢 (15 分)

unordered_map 容器,直译过来就是"无序 map 容器"的意思。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。

具体来讲,unordered_map 容器和 map 容器一样,以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改。但由于 unordered_map 容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。

 C++ STL unordered_map容器用法详解 (biancheng.net)

#include<bits/stdc++.h>
using namespace std;
unordered_map<string,string> win{
    {"Bu","JianDao"},
    {"ChuiZi","Bu"},
    {"JianDao","ChuiZi"}
};

int main(){
    int k,cnt=0;
    cin>>k;
    string str;
    while(cin>>str){
        if(str=="End")
            break;
        else if(cnt == k){
            cnt = 0;
            cout<<str<<endl;
        }else{
            cout<<win[str]<<endl;
            cnt++;
        }
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值