团队程序天梯赛练习题题解

目录

L1—001 Hello World

L1—002 打印沙漏

L1—003 个位数统计

L1—004 计算摄氏温度

L1—005 考试座位号

L1—006 连续因子

L1—007 念数字

L1—008 求整数段和

L1—009 N个数求和

L1—010 比较大小

L1—011 A-B

L1—012 计算指数

L1—013 计算阶乘和

L1—014 简单题

L1—015 跟奥巴马一起画方块

L1—016 查验身份证

L1—017 到底有多二

L1—018 大笨钟

后续会继续更新,本人小菜鸡,第一次发文章,勿喷。


L1—001 Hello World

这道超级简单的题目没有任何输入。

你只需要在一行中输出著名短句“Hello World!”就可以了。

输入样例:

输出样例: 

Hello World!

思路:签到题,上代码

代码:

#include<iostream>
using namespace std;
int main()
{
    cout<<"Hello World!"<<endl;
    return 0;

L1—002 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式: 

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样式:

19 *

 输出样式: 

*****
 ***
  *
 ***
*****
2

思路:首先确定他是多少行,空格分为漏斗上部分以及下面,2个if,空格为0-n-1; 第一行符号数为2*num-1,每一行-2;到1个是-2改为+2;

代码如下:

#include<iostream>
using namespace std;
int main()
{
    int n; char x;
    cin >> n >> x;
    int sum = n + 1;
    int num = 0, w = 0;
    for (int i = 1; sum > 0; i += 2)
    {
        if (sum - 2*i >= 0)
        {
            sum -= i * 2;
            num++;
        }
        else break;
    }
    for (int i = 1; i <= num * 2 - 1; i++)
    {
        if (i <= num)
        {
            for (int q = 1; q < i && q <= num; q++)
            {
                cout << " ";
            }
            for (int j = 1; j <= 2 * num - 1 - w; j++)
            {
                cout << x;
            }
            w += 2;
        }
        if (i > num)
        {
            int abb = i - num;
            for (int q = num; q > abb + 1; q--)
            {
                cout << " ";
            }
            for (int r = 1; r <= 2 * abb + 1; r++)
            {
                cout << x;
            }
        }
        cout << endl;
    }
    cout << sum << endl;
    return 0;

L1—003 个位数统计

给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式: 

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样式:

100311

 输出样式: 

0:2
1:3
3:1

思路:暴力,因为输入的数位<1000 ,所以long long肯定要爆,所以用string。然后用结构体进行统计(类似木桶排序)暴力求解。

代码 

#include<iostream>
using namespace std;
struct num {
    char a='0';
    int shu=0;
}abb[10];
int main()
{
    string sum; cin >> sum;
    abb[1].a = '1';
    abb[2].a = '2';
    abb[3].a = '3';
    abb[4].a = '4';
    abb[5].a = '5';
    abb[6].a = '6';
    abb[7].a = '7';
    abb[8].a = '8';
    abb[9].a = '9';
    int len = sum.length();
    int p = 0;
    while (p<len)
    {
        if (sum[p] == abb[0].a)
            abb[0].shu++;
        else if (sum[p] == abb[1].a)
            abb[1].shu++;
        else if (sum[p] == abb[2].a)
            abb[2].shu++;
        else if (sum[p] == abb[3].a)
            abb[3].shu++;
        else if (sum[p] == abb[4].a)
            abb[4].shu++;
        else if (sum[p] == abb[5].a)
            abb[5].shu++;
        else if (sum[p] == abb[6].a)
            abb[6].shu++;
        else if (sum[p] == abb[7].a)
            abb[7].shu++;
        else if (sum[p] == abb[8].a)
            abb[8].shu++;
        else if (sum[p] == abb[9].a)
            abb[9].shu++;
        p++;
    }
    for (int i = 0; i < 10; i++)
    {
        if (abb[i].shu != 0)
        {
            cout << abb[i].a << ":" << abb[i].shu << endl;
        }
    }
    return 0;

L1—004 计算摄氏温度

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。

输入格式: 

输入在一行中给出一个华氏温度。

输出格式:

在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。

输入样式:

150

输出样式: 

Celsius = 65

思路:太简单了 ,直接上代码

#include<iostream>
using namespace std;
int main()
{
    double F;
    cin>>F;
    int num=5*(F-32)/9.0;
    cout<<"Celsius = "<<num<<endl;
}

L1—005 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式: 

输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样式:

4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

输出样式: 

3310120150912002 2
3310120150912119 1

思路:和第三题差不多 

 代码:

#include<iostream>
#define MAx 1010
using namespace std;
struct str {
    string num;
    int a;
    int b;
}abb[MAx];
int aqq[MAx] = { 0 };
int main()
{
    int n; cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> abb[i].num >> abb[i].a >> abb[i].b;
    }
    int sum; cin >> sum;
    for (int i = 1; i <= sum; i++)
    {
        cin >> aqq[i];
    }
    for (int i = 1; i <= sum; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (abb[j].a == aqq[i])
                cout << abb[j].num << " " << abb[j].b << endl;
        }
    }
    return 0;
}

L1—006 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<231)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

 输出样例:

3
5*6*7

思路:这个题我们可能陷入一个误区,我们需要求出除连续序列的另外数,其实不然,我们不需要 求出来,我们只要设一个函数(求连续序列的起始值),设2个变量(长度,连续序列起始值),不断更新。长度初始化为0,不能为1。如果长度初始化为1,连续序列起始值为N,像9,他会输出9,但是应该为3,这是第四检测点。我就在这卡了一段时间。废话不多说,上代码

代码:

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
long long int N;
long long int len = 0, r = N;//含义分别为长度,连续序列起始数
int aqq(long long int n)
{
    for (int i = 2; i <= sqrt(n); i++)//sqrt为平方根
    {
        if (n % i == 0)
        {
            return 0;
        }
    }
    return 1;
}
long long int abb(int x)//x为连续序列从x开始
{
    long long int num=0,sum=N;
    for (long long int i = x; i <= sum; i++)
    {
        if (sum % i == 0)
        {
            num++;
            sum /= i;
        }
        else break;
    }
    return num;
}
int main()
{
    cin >> N;
    if (aqq(N))//可能出现无因数除了本身,如3
    {
        cout << 1 << endl;
        cout << N << endl;
        return 0;
    }
    for (long long int i = 2; i <= sqrt(N); i++)
    {
        long long int q = abb(i);
        if (q > len)
        {
            len = q;
            r = i;
        }
    }
    cout << len << endl;
    if(len!=0) {
        for (long long int j = r; j < r + len; j++)
        {
            if (j != r + len - 1)
            {
                cout << j << "*";
            }
            else cout << j << endl;
        }
    }
    else {
        cout<<1<<endl;
        cout<<N<<endl;
    }
    return 0;
}

L1—007 念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

输入格式: 

输入在一行中给出一个整数,如:1234

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si

输入样例:

-600

 输出样例:

fu liu ling ling

思路:首先判断正负,用结构体命名。输出符号,上代码

代码: 

#include<iostream>
#include<math.h>//abs头文件
using namespace std;
struct num {
    string num;
}abb[10];
int aqq[110] = { 0 }, wei = 0;
int main()
{
    long long int sum; cin >> sum;
    abb[0].num = "ling";
    abb[1].num = "yi";
    abb[2].num = "er";
    abb[3].num = "san";
    abb[4].num = "si";
    abb[5].num = "wu";
    abb[6].num = "liu";
    abb[7].num = "qi";
    abb[8].num = "ba";
    abb[9].num = "jiu";
    if (sum < 0)
    {
        cout << "fu" << " ";
        sum = abs(sum);//abs函数是把负数变为正数
    }
    while(sum)
    {
        aqq[wei+1] = sum % 10;
        sum /= 10;
        wei++;
    }
    for (int i = wei; i > 1; i--)
    {
        cout << abb[aqq[i]].num << " ";
    }
    cout<<abb[aqq[1]].num<<endl;
    return 0;
}

L1—008 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:

首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X

输入样例:

-3 8

 输出样例:

   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30

 思路:一个for循环,从A开始,B结束,定义一个变量,用来控制换行(k%5==0),话不多说,直接上代码

代码:

#include<iostream>
using namespace std;
int num = 0,Sum=0;
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = n; i <= m; i++)
    {
        printf("%5d", i);//考点,c语言中的占字符大小输出
        num++;
        if (num % 5 == 0&&i!=m)//i!=m这是检测点1卡的,如0-4
            cout << endl;
        Sum += i;
    }
    cout << endl;
    printf("Sum = %d",Sum);
    return 0;
}

L1—009 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

 输出样例1:

3 1/3

输入样例2: 

2
4/3 2/3

输出样例2: 

2

 输入样例3:

3
1/3 -1/6 1/8

 输出样例3:

7/24

思路:这题我卡了几个小时,就是卡了监测点5,没有考虑是0的情况。这一题可以用一个2维数组写(分子abb[i][0],分目abb[i][1]),也可以用2个变量。 不要等他全部输入完再算,因为这样会段错误。就算long long int也会超(因为分目的范围是长整形,最小公倍数是a*b/M(a,b),M(a,b)是最大公约数)。这是一个误区,其他没有什么,上代码。

代码:

#include<stdio.h>
#include<iostream>
#include <math.h>
int M(int a,int b)
{
    if(b==0)
        return a;
    else
        return M(b,a%b);
}
int main(void)
{
    int n, sum = 0;
    int a, b;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) 
    {
        int a1, b1;
        scanf("%d/%d", &a1, &b1);
        sum += a1 / b1;
        a1 = a1 % b1;
        if (i == 1) {
            a = a1, b = b1;
        } 
        else 
        {
            int m = b * b1 / M(b, b1);
            a = a * (m / b) + a1 * (m / b1);
            b = m;
            sum += a / b;
            a = a % b;
        }
            int l = M(a, b);
            a /= l;
            b /= l;
    }
    if (sum == 0) 
    {
        if (a == 0)
        {
            printf("0\n");//第五个测试点
        } 
        else 
        {
            printf("%d/%d", a, b);
        }
    } 
    else
    {
        printf("%d", sum);
        if (a == 0) //第二和第四测试点,没有分数部分
        {
            printf("\n");
        } 
        else 
        {
            printf(" %d/%d", a, b);
        };
    }
    return 0;
}

L1—010 比较大小

本题要求将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

4 2 8

 输出样例:

2->4->8

 思路:签到题,已经知道是3个数,排序。直接数组,用sort排序函数。没有什么说的,直接上代码

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    //确定数的个数,一个数组,排个序
    int abb[3];
    for (int i = 0; i < 3; i++)
    {
        cin >> abb[i];
    }
    sort(abb, abb + 3);
    for (int i = 0; i < 2; i++)//最后一个没有->,所以到倒数第二个
    {
        cout << abb[i] << "->";
    }
    cout << abb[2] << endl;//把最后一个输出来
    return 0;

L1—011 A-B

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:

输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出A−B的结果字符串。

输入样例:

I love GPLT!  It's a fun game!
aeiou

 输出样例:

I lv GPLT!  It's  fn gm!

思路:这题难在空格怎么输入,不能用cin,如果是char数组,要用cin.get ;如果是string,就用getline(cin,x);只不过要注意他们的头文件。怎么输出,就是要通过标识字符,用一个结构体,通过字符之间ascll值不同来记录。输出的时候访问结构体,如果里面值不为0,则跳过,反之,输出。话不多说,上代码

代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct num{
    int name=0;
}abb[128];
int main()
{
    string n, m;
    getline(cin,n);
    getline(cin, m);
    int len1 = n.length();//这不能用cin,因为cin不能输入空格
    int len2 = m.length();
    for (int i = 0; i < len2; i++)
    {
        abb[int(m[i] - ' ')].name++;
    }
    for (int i = 0; i < len1; i++)
    {
        if (!abb[int(n[i] - ' ')].name)
            cout << n[i];
    }
    return 0;
}

L1—012 计算指数

真的没骗你,这道才是简单题 —— 对任意给定的不超过 10 的正整数 n,要求你输出 2n。不难吧?

输入格式:

输入在一行中给出一个不超过 10 的正整数 n。

输出格式:

在一行中按照格式 2^n = 计算结果 输出 2n 的值。

输入样例:

5

 输出样例:

2^5 = 32

思路:签到题,可以用for循环,或者直接用pow指数函数,用pow要注意头文件。

代码:

#include<iostream>
#include<cmath>//pow的头文件
using namespace std;
int main()
{
    //签到题,用指数函数就行
    int n;cin>>n;
    cout<<"2^"<<n<<" = "<<pow(2,n)<<endl;
    return 0;
}

L1—013 计算阶乘和

对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。

输入格式:

输入在一行中给出一个不超过10的正整数N。

输出格式:

在一行中输出S的值。

输入样例:

3

输出样例: 

9

思路:2个数,一个求n!,一个求和。用一个for循环就可以解决了。比较简单

代码: 

 #include<iostream>
using namespace std;
int main()
{
    int sum=0,num=1;
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        num*=i;
        sum+=num;
    }
    cout<<sum<<endl;
    return 0;
}

L1—014 简单题

这次真的没骗你 —— 这道超级简单的题目没有任何输入。

你只需要在一行中输出事实:This is a simple problem. 就可以了。

输入样例:

输出样例:

This is a simple problem.

 思路:签到题,没有什么好说的

代码:

#include<iostream>
using namespace  std;
int main()
{
    cout<<"This is a simple problem."<<endl;
    return 0;
}

L1—015 跟奥巴马一起画方块

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式:

输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。

输出格式:

输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

输入样例:

10 a

输出样例:

aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa

思路:这个题就难在输出行(四舍五入),其他的2个嵌套for循环就解决了。四舍五入其实也比较简单,+个0.5就OK了。没有超过0.5的,就为0,超过了就整数加一,小数也为0.上代码

代码: 

#include<iostream>
using namespace std;
int main()
{
    double N;cin>>N;
    char a;cin>>a;
    for(int i=1;i<=(int)(N/2+0.5);i++)
    {
        for(int j=1;j<=N;j++)
        {
            cout<<a;
        }
        cout<<endl;
    }
    return 0;
}

L1—016 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:

输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X

输入样例2:

2
320124198808240056
110108196711301862

输出样例2:

All passed

 思路:这个题难在理解第18位数怎么来的,其他的没有什么难点。还有就是不要忘记了,我们是输出错误的,全对要输出“All passed”。详情请看代码

代码:

#include<iostream>
#include<map>
using namespace std;
char aqq[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int weight[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
bool abb(string x)//判断是否为正确的身份证
{
    long long int leng=0;
    for(int i=0;i<17;i++)
    {
        if(x[i]<'0'||x[i]>'9')
            return 1;
        leng+=weight[i]*(x[i]-'0');
    }
    leng=leng%11;
    if(aqq[leng]!=x[17])
        return 1;
    else return 0;
}
int main()
{
    int n,num=0;cin>>n;
    for(int i=1;i<=n;i++)
    {
        string name;cin>>name;
        if(abb(name))
        {
            cout<<name<<endl;
            num++;
        }
    }
    if(!num)
    {
        cout<<"All passed"<<endl;
    }
    return 0;
}

L1—017 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

输入格式:

输入第一行给出一个不超过50位的整数N

输出格式:

在一行中输出N犯二的程度,保留小数点后两位。

输入样例:

-13142223336

输出样例:

81.82%

 思路:难点在哪里?在理解题目上,负数加0.5倍,所以*1.5,偶数加0.2倍,所以为2,这是一难点。其次是不能用long long int,要用string。首先,判断正负,其次判断奇偶。题目输出要求是要化为百分比,所以要乘100,后面加一个%。如果还是不会,请看下面代码。

 代码:

#include<iostream>
using namespace std;
struct num {
    double nam;
}abb[10];
int main()
{
    string n; float sum = 0;
    cin >> n;
    int len = n.length();
    if (n[0] == '-')
    {
        for (int i = 1; i < len; i++)
        {
            abb[(int)(n[i] - '0')].nam++;
        }
        if((n[len-1]-'0')%2==0)
            sum = (abb[2].nam / (len - 1)) * 1.5 * 2;
        else sum = (abb[2].nam / (len - 1)) * 1.5;//为负,奇数
        printf("%.2f", sum * 100); cout << "%" << endl;
    }
    else {
        for (int i = 0; i < len; i++)
        {
            abb[(int)(n[i] - '0')].nam++;
        }
         if((n[len-1]-'0')%2==0)
             sum= (abb[2].nam / (len)) * 2;
        else sum= (abb[2].nam / (len)) ;
        printf("%.2f", sum * 100); cout << "%" << endl;
    }
    return 0;
}

L1—018 大笨钟

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

下面就请你写个程序,根据当前时间替大笨钟敲钟。

输入格式:

输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:

根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

Only hh:mm.  Too early to Dang.

其中hh:mm是输入的时间。

输入样例1:

19:05

输出样例1:

DangDangDangDangDangDangDangDang

输入样例2:

07:05

输出样例2:

Only 07:05.  Too early to Dang.

 思路:可以用2个变量,一个是小时,一个是分钟。第二种方法,用一个变量(我用的方法)。

下面讲讲我的思路(一个变量):string变量类型,看输入类型知道,前面2个字符为小时,第三个为:,后面2个为分钟。我们通过把小时,分钟化为数型。然后判断,分钟为0,输出小时-12下,否则输出小时-12+1下。详情看代码:

 代码:

#include<iostream>
using namespace std;
string c = "Dang";
int hh = 0, mm = 0;
int main()
{
    string h; 
    cin >> h;
    if ((h[0] - '0') == 0)
        hh = h[1]-'0';
    else if((h[0] - '0') != 0)
    {
        hh = (h[0] - '0') * 10 + (h[1] - '0');
    }
    if ((h[3] - '0') == 0)
        mm = h[4]-'0';
    else if((h[3] - '0') != 0) {
        mm = (h[3] - '0') * 10 + (h[4] - '0');
    }
    if (hh == 12 && mm != 0) {
        cout << c << endl;
    }
    else if (hh > 12)
    {
        int len = hh - 12;
        if (mm != 0)
            len++;
        for (int i = 1; i <= len; i++)
        {
            cout << c;
        }
    }
    else cout << "Only " << h<<".  Too early to Dang." << endl;
    return 0;
}

后续会继续更新,本人小菜鸡,第一次发文章,勿喷。

  • 32
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值