蓝桥杯练习(2)

这都是我上上周做的内容了

说实话我都已经快忘光了

看到的时候完全不记得这是我写过的东西

题目 1093: 字符逆序

题目描述
将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。
输入
输入包括一行。 第一行输入的字符串。
输出
输出转换好的逆序字符串。
样例输入
I am a student
样例输出
tneduts a ma I

代码其实不长,可以通过循环减1或者加1达到顺序或者倒序输出的目的

strlen函数是包含在cstring头文件里的,作用相当于计数器

将字符串的数目记录下来作为阈值然后倒序输出

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char str[100];
    int n;
        gets(str);
     n=strlen(str);
    for(int i=n-1;i>=0;i--)
        cout<<str[i];
    cout<<endl;
    return 0;
}

题目 1094: 字符串的输入输出处理

题目描述
字符串的输入输出处理。
输入
第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。
输出
先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。
样例输入
2
www.dotcpp.com DOTCPP
A C M
D O T CPP
样例输出
www.dotcpp.com DOTCPP

A C M

D

O

T

CPP

这题说实话还蛮恶心的,我自己是没写出来

我看的做法都是混用C的,不知道有没有更好的办法

讲道理这循环真看的我头疼

getchar这个函数主要是用来检测是否到文本末端的,需要C标准库

当它读不到东西了或者读到啥未知的就会返回eof(eof的值就相当于-1,就是布尔类型的false)

剩下的主要是拆循环和判断问题

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

int main() {
    
    int n,cnt;
    cin>>n;
    cnt = 0;
    string s;
    getchar();
    
    while(getline(cin,s)) {
        cnt++;
        if(cnt <= n) {
            cout<<s<<endl<<endl;
        }
        else {
            string tmp="";
            int j = 0;
            for(int i = 0; i < (int)s.length(); i++) {
                if(s[i]!=' ') {
                    tmp += s[i];
                }
                else {
                    if(tmp == "") {
                        continue;
                    }
                    else {
                        cout<<tmp<<endl<<endl;
                    }
                    tmp = "";
                }
            }
            if(tmp != "") {
               cout<<tmp<<endl<<endl;
            }
        }
    }
    return 0;
}

题目 1095: The 3n + 1 problem

题目描述
Consider the following algorithm to generate a sequence of numbers. Start with an integer n. If n is even, divide by 2. If n is odd, multiply by 3 and add 1. Repeat this process with the new value of n, terminating when n = 1. For example, the following sequence of numbers will be generated for n = 22: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 It is conjectured (but not yet proven) that this algorithm will terminate at n = 1 for every integer n. Still, the conjecture holds for all integers up to at least 1, 000, 000. For an input n, the cycle-length of n is the number of numbers generated up to and including the 1. In the example above, the cycle length of 22 is 16. Given any two numbers i and j, you are to determine the maximum cycle length over all numbers between i and j, including both endpoints.
输入
The input will consist of a series of pairs of integers i and j, one pair of integers per line. All integers will be less than 1,000,000 and greater than 0.
输出
For each pair of input integers i and j, output i, j in the same order in which they appeared in the input and then the maximum cycle length for integers between and including i and j. These three numbers should be separated by one space, with all three numbers on one line and with one line of output for each line of input.
样例输入
1 10
100 200
201 210
900 1000
样例输出
1 10 20
100 200 125
201 210 89
900 1000 174

我一直觉得英文题目特不好做,翻译就够我喝一壶的。。

这个问题叫做冰雹猜想(点击跳转百科)

大概意思是有一个数n,当它是偶数就等于自己除于2

当它是奇数就等于自己乘3加1,最后一直化到1

划到1需要用的次数称为周期T

现在给你指定了i和j两个数

从i到j包括他们俩所有的数都有一个到1的周期T

你需要输入i j

输出 i j Tmax(就是所有数化到1的最大值)

其实算法不是很难,这里可以直接用三目运算符来计算

我的算法虽然答案是正确的但是超时了。。

以下是我的错误算法

#include<iostream>
using namespace std;

int main(){
    int i=0;
    int j=0; 
    int T=1;
    int n=0;
    int a[200];
    int b=0;
    int I=0;
    cin>>i>>j;
    I=i;
    while(I<=j){
        n=I;
        if(n == 1){
            a[0]=0;
            b++;
            I++;
            continue;
        }else{
            while(n != 1){
                n = (n%2 == 0)?n/2:n*3+1;  
                T++;
            }
        }
        a[b]=T;
        T=1;
        b++;
        I++;
    }
    for(b=0;b<=j-i;b++){
        if(a[b]>a[b+1]){
            int change;
            change = a[b+1];
            a[b+1] = a[b];
            a[b] = change;
        }
    }
    cout<<i<<" "<<j<<" "<<endl;
    cout<<a[j-i]<<endl;
    return 0;
}

以下是大佬的参考算法

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int main() {

int l, r;

while (scanf("%d%d", &l, &r) != EOF) {

printf("%d %d ", l, r);

if (l > r) swap(l, r);

int mlen = 0, tlen = 0;

for (int i = l, temp = l; i <= r; i++, temp = i) {

tlen = 1;

while (temp != 1) {

if (temp % 2) temp = temp * 3 + 1;

else temp /= 2;

tlen++;

}

mlen = max(mlen, tlen);

}

printf("%d\n", mlen);

}

return 0;

}

bits/stdc++.h是个很特殊的头文件

这个头文件相当于万能库,包含了很多常见的头文件

缺点是大部分oj和ide过不了编译,而且编译速度慢不可移植

所以实际运用的时候慎用

#include<bits/stdc++.h>
using namespace std;
int i,j;
int period(int x){
    int count=1;
    while(x!=1){
        if(x%2) x=x*3+1;
        else x/=2;
        count++;
    }
    return count;
}
int main(){
    while(cin>>i>>j){
        int maxn=0;
        for(int a=min(i,j);a<=max(i,j);a++)
            maxn=max(maxn,period(a));
        cout<<i<<" "<<j<<" "<<maxn<<endl;
    }
    return 0;
}

发表评论

您的电子邮箱地址不会被公开。