天梯赛做题小技巧总结

目录

目录

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

二、用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
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>id[i];
    for(int i = 0;i

二、用vector整行输入整数

L1-022 奇偶分家 (10 分)

#include
using namespace std;

int main(){
    int n,b;
    cin>>n;
    int odd=0,even = 0;
    vector num;
    while(n--){    //这里开始
        cin>>b;
        num.push_back(b);
        if(cin.get()=='\n')
            break;
    }
    for(int i = 0;i

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

L1-028 判断素数 (10 分)

#include
using namespace std;

int main(){
    int n;
    cin>>n;
    int a[n];
    bool flag;
    string result[n];
    for(int i = 0;i>a[i];
    for(int i = 0;i

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

L1-033 出生年 (15 分)

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


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

#include
using namespace std;

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

五、vector的应用

L1-035 情人节 (15 分)

#include
using namespace std;

int main(){
    vector name;
    string a;
    while(true){
        cin>>a;
        getchar();
        if(a!=".")
            name.push_back(a);
        else
            break;
    }
    if(name.size()>=15)
        cout<=2)
        cout<

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

L1-037 A除以B (10 分)

#include
using namespace std;

int main(){
    double a,b,result;
    cin>>a;
    getchar();
    cin>>b;
    
    if(b==0)
        cout<

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

# include 
void *memset(void *s, int c, unsigned long n);

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

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

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

#include
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

九、数组整行输入

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

#include
using namespace std;

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

    }
    if(col1 != row2){
        cout<<"Error: "<十、竖式除法的程序实现 
  

L1-046 整除光棍 (20 分)

#include
using namespace std;

int main(){
    int x,n=1;
    int i = 1;
    cin>>x;
    for(;i

天梯赛做题小技巧总结_第1张图片

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

L1-056 猜数字 (20 分)

#include
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>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

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

#include
#include
#include
using namespace std;

int main() {

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

int main(){
    int count,i=0;
    string a;
    getline(cin,a);    //这种方法可以录入空格
    while(i3&&count<=9)
                cout<<'9';
            else if(count>9)
                cout<<"27";
            else if(count <= 3){
                for(int j = i-count;j

十三、判断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
using namespace std;

int main(){
    vector 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

十四、二进制转成十进制

L1-071 前世档案 (20 分) 

#include
using namespace std;

int main(){
    int n,m,i,num;
    cin>>n>>m;
    string a[m];
    for(i = 0;i>a[i];
    string bin="";   //二进制数
    for(i = 0;i

十五、递归求最大公约数

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

#include
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
using namespace std;
unordered_set str_b;

int main(){
    string a,b;
    getline(cin,a);
    getline(cin,b);
    
    for(int i = 0;i

十七、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
using namespace std;
unordered_map 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<

 

你可能感兴趣的:(算法)