团体程序设计天梯赛-L1练习集

目录

L1-002 打印沙漏 (20 分)

输入格式:

输出格式:

输入样例:

输出样例:

L1-006 连续因子 (20 分)

输入格式:

输出格式:

输入样例:

输出样例:

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

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

输入样例3:

输出样例3:

L1-017 到底有多二 (15 分)

输入格式:

输出格式:

输入样例:

输出样例:

L1-039 古风排版 (20 分)

输入格式:

输出格式:

输入样例:

输出样例:

L1-046 整除光棍 (20 分)

输入格式:

输出格式:

输入样例:

输出样例:

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

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

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

输入格式:

输出格式:

输入样例:

输出样例:

L1-059 敲笨钟 (20 分)

输入格式:

输出格式:

输入样例:

输出样例:

L1-071 前世档案 (20 分)

输入格式:

输出格式:

输入样例:

输出样例:

L1-078 吉老师的回归 (15 分)

输入格式:

输出格式:

输入样例 1:

输出样例 1:

输入样例 2:

输出样例 2:

L1-080 乘法口诀数列 (20 分)

输入格式:

输出格式:

输入样例:

输出样例:

样例解释:


L1-002 打印沙漏 (20 分)

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2
#include
#include
#include
int main()
{
    int n;
    char a;
    scanf("%d %c",&n,&a);
    int x=sqrt((n+1)/2);
    int left=0;
    if(x*x==(n+1)/2)left=0;
    if(x*x<(n+1)/2)left=n-2*x*x+1;
    for(int i=x;i>=1;i--)
    {
        for(int j=1;j<=x-i;j++)
        printf(" ");
        for(int j=1;j<=2*i-1;j++)
        {
            printf("%c",a);
        }
        printf("\n");
    }
    for(int i=1;i<=x;i++)
    {
        if(i==1)continue;//前面一个for循环已经打印过了
        for(int j=1;j<=x-i;j++)
            printf(" ");
        for(int j=1;j<=2*i-1;j++)
        {
            printf("%c",a);
        }
        printf("\n");
    }
    printf("%d",left);
    return 0;
}

L1-006 连续因子 (20 分)

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

输入格式:

输入在一行中给出一个正整数 N(1

输出格式:

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

输入样例:

630

输出样例:

3
5*6*7
#include
#include
#include
int main()
{
    long long n;
    scanf("%lld",&n);
    int max=0,start=0;
    for(int i=2; i<=sqrt(n); i++)
    {
        int j=i;
        int num=0;
        int t=n;
        while(t%j==0)
        {
            t=t/j;//容易错
            j++;
            num++;
        }
        if(num>max)
        {
            start=i;
            max=num;
        }
    }
    if(max==0)printf("1\n%d",n);
    else
    {
        printf("%d\n",max);
        for(int i=0; i

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

本题的要求很简单,就是求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
#include
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a,b;
    char c;
    long long ans1=0,ans2=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a>>c>>b;
        ans1=ans1*b+a*ans2;
        ans2*=b;
        long long k=__gcd(abs(ans1),ans2);
        ans1/=k;
        ans2/=k;
    }
    if(ans1%ans2==0)cout<ans2)cout<

L1-017 到底有多二 (15 分)

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

输入格式:

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

输出格式:

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

输入样例:

-13142223336

输出样例:

81.82%
#include
#include
char a[60];
int main()
{
    gets(a+1);
    if(a[1]=='-')
    {
        int l=strlen(a+2);
        int num=0;
        for(int i=2; i<=l+1; i++)//l+1!!!!!!!!!!!!!!
        if(a[i]=='2')num++;
        double ans;
        if((a[l+1]-'0')%2==0)//l+1!!!!!!!!!!!!!!
        {
            ans=num*1.0/l*1.5*2*100;
            printf("%0.2lf%%",ans);
        }
        else
        {
            ans=num*1.0/l*1.5*100;
            printf("%0.2lf%%",ans);
        }
    }
    else
    {
        int l=strlen(a+1);
        int num=0;
        for(int i=1; i<=l; i++)
        if(a[i]=='2')num++;
        double ans;
        if((a[l]-'0')%2==0)
        {
            ans=num*1.0/l*2*100;
            printf("%0.2lf%%",ans);
        }
        else
        {
            ans=num*1.0/l*100;
            printf("%0.2lf%%",ans);
        }
    }
    return 0;
}

L1-039 古风排版 (20 分)

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:

4
This is a test case

输出样例:

asa T
st ih
e tsi
 ce s
#include
#include
#include
char a[1010];
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    gets(a);
    int l=strlen(a);
    int lie=0;
    if(l%n==0)lie=l/n;
    else lie=l/n+1;
    int temp;
    for(int i=0;i

L1-046 整除光棍 (20 分)

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

31

输出样例:

3584229390681 15
#include
#include
#include
char a[100];
int main()
{
    int x;
    scanf("%d",&x);
    int top=0;
    int n=1,wei=1;
    while(1)
    {
        if(top||n/x)
        {
            top++;
            a[top]=n/x+'0';
        }
        if(n%x==0)//易错!!!!!!!
        {
            printf("%s %d",a+1,wei);
            break;
        }
        n=n%x;
        n=n*10+1;
        wei++;

    }
    return 0;
}

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

给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。

输入格式:

输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:

若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

输出样例1:

2 4
20 22 24 16
53 58 63 28

输入样例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72

输出样例2:

Error: 2 != 3
#include
#include
#include
int a[100][100],b[100][100];
int main()
{
   int ra,ca;
   scanf("%d%d",&ra,&ca);
   for(int i=1;i<=ra;i++)
   {
       for(int j=1;j<=ca;j++)
       {
           scanf("%d",&a[i][j]);
       }
   }
   int rb,cb;
   scanf("%d%d",&rb,&cb);
   for(int i=1;i<=rb;i++)
   {
       for(int j=1;j<=cb;j++)
       {
           scanf("%d",&b[i][j]);
       }
   }
   if(ca!=rb)printf("Error: %d != %d",ca,rb);
   else
   {
       printf("%d %d\n",ra,cb);
       for(int i=1;i<=ra;i++)
       {
           for(int j=1;j<=cb;j++)
           {
               int sum=0;
               for(int k=1;k<=ca;k++)
               {
                   sum+=a[i][k]*b[k][j];
               }
               printf("%d",sum);
               if(j==cb)printf("\n");
               else printf(" ");
           }
       }
   }
    return 0;
}

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

给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。

输入格式:

输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤105)。

输出格式:

在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。

输入样例:

3 7417

输出样例:

pat
#include
#include
#include
char a[10];
int main()
{
    int l;
    long long n;
    scanf("%d%lld",&l,&n);
    long long m=pow(26,l);
    int top=0;
    int start=m-n;//从0开始
    while(l--)
    {
        top++;
        a[top]='a'+start%26;
        start=start/26;
    }
    for(int i=top;i>=1;i--)
        printf("%c",a[i]);
    return 0;
}

L1-059 敲笨钟 (20 分)

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式:

输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式:

对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例:

5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.

输出样例:

xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped
#include
using namespace std;
string a;
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        getline(cin,a);
        int d1=a.find(','),d2=a.find('.');
        int num=count(a.begin(),a.end(),' ');
        int l=a.size();
        int t=0;
        if(a[d1-1]=='g'&&a[d1-2]=='n'&&a[d1-3]=='o'&&a[d2-1]=='g'&&a[d2-2]=='n'&&a[d2-3]=='o')
        {
           for(int i=0;i

L1-071 前世档案 (20 分)

网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。

团体程序设计天梯赛-L1练习集_第1张图片

现在我们把结论从左到右顺序编号,编号从 1 开始。这里假设回答都是简单的“是”或“否”,又假设回答“是”对应向左的路径,回答“否”对应向右的路径。给定玩家的一系列回答,请你返回其得到的结论的编号。

输入格式:

输入第一行给出两个正整数:N(≤30)为玩家做一次测试要回答的问题数量;M(≤100)为玩家人数。

随后 M 行,每行顺次给出玩家的 N 个回答。这里用 y 代表“是”,用 n 代表“否”。

输出格式:

对每个玩家,在一行中输出其对应的结论的编号。

输入样例:

3 4
yny
nyy
nyn
yyn

输出样例:

3
5
6
2
#include
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int ans=0;
        for(int j=1;j<=n;j++)
        {
            char a;
            cin>>a;
            if(a=='y')ans=ans*2+0;
            else ans=ans*2+1;
        }
        cout<

L1-078 吉老师的回归 (15 分)

曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦!

为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的字符串描述出来,如:Problem A: Print "Hello world!"

众所周知,吉老师的竞赛水平非常高超,你可以认为他每道题目都会做(事实上也是……)。因此,吉老师会按照顺序看题并做题。但吉老师水平太高了,所以签到题他就懒得做了(浪费时间),具体来说,假如题目的字符串里有 qiandao 或者 easy(区分大小写)的话,吉老师看完题目就会跳过这道题目不做。

现在给定这次天梯赛总共有几道题目以及吉老师已经做完了几道题目,请你告诉大家吉老师现在正在做哪个题,或者吉老师已经把所有他打算做的题目做完了。

提醒:天梯赛有分数升级的规则,如果不做签到题可能导致团队总分不足以升级,一般的选手请千万不要学习吉老师的酷炫行为!

输入格式:

输入第一行是两个正整数 N,M (1≤M≤N≤30),表示本次天梯赛有 N 道题目,吉老师现在做完了 M 道。

接下来 N 行,每行是一个符合题目描述的字符串,表示天梯赛的题目内容。吉老师会按照给出的顺序看题——第一行就是吉老师看的第一道题,第二行就是第二道,以此类推。

输出格式:

在一行中输出吉老师当前正在做的题目对应的题面(即做完了 M 道题目后,吉老师正在做哪个题)。如果吉老师已经把所有他打算做的题目做完了,输出一行 Wo AK le

输入样例 1:

5 1
L1-1 is a qiandao problem.
L1-2 is so...easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so easy.

输出样例 1:

L1-4 is qianDao.

输入样例 2:

5 4
L1-1 is a-qiandao problem.
L1-2 is so easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so!!easy.

输出样例 2:

Wo AK le
#include
using namespace std;
string s,ans;
int main()
{
    int n,m;
    cin>>n>>m;
    getchar();
    int num=0,check=0;
    for(int i=1; i<=n; i++)
    {
        getline(cin,s);//不会留下\n
        if(s.find("qiandao")!=-1||s.find("easy")!=-1)continue;//这一步容易错
        num++;
        if(num==m+1)
        {
            ans=s;
            check=1;
            //break;
        }
    }
    if(check==1)cout<

L1-080 乘法口诀数列 (20 分)

本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

输入格式:

输入在一行中给出 3 个整数,依次为 a1​、a2​ 和 n,满足 0≤a1​,a2​≤9,0

输出格式:

在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

2 3 10

输出样例:

2 3 6 1 8 6 8 4 8 4

样例解释:

数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。

#include
#include
int k[5010];
int main()
{
    int a1,a2,n;
    scanf("%d%d%d",&a1,&a2,&n);
    int num=2,top=0;
    top++;
    k[top]=a1;
    top++;
    k[top]=a2;
    int i=1;
    for(int t;t<=n;t++)
    {
        top++;
        k[top]=k[i]*k[i+1];
        if(k[top]>=10)
        {
           k[top+1]=k[top]%10;
           k[top]/=10;
           top++;
        }
        i++;
    }
    for(int i=1;i<=n;i++)
    {
         printf("%d",k[i]);
         if(i!=n)printf(" ");
    }
    return 0;
}

你可能感兴趣的:(天梯赛习题,c语言,c++)