当前位置 : 主页 > 编程语言 > c语言 >

团体程序设计天梯赛20分题目+题解合集

来源:互联网 收集:自由互联 发布时间:2023-08-25
1、L1-006 连续因子 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因
1、L1-006 连续因子

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

输入格式: 输入在一行中给出一个正整数 N(1<N<2 ^31 )。

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

630

3
5*6*7
#include<iostream>
using namespace std;
#include<vector>
#include<cmath>
int main()
{
    int n;
    cin>>n;
    vector<int> res;
    int temp;
    for(int i=2;i<=sqrt(n);i++)//一个数的因子除了本身之外,其他一定<=sqrt(n)
    {
        temp=1;
        vector<int> v;
        for(int j=i;temp<=n;j++)
        {
            temp=temp*j;
            
            if(n%temp==0)
            {
                v.push_back(j);
                if(v.size()>res.size())
                {
                //将区间[first,last)的元素赋值到当前的vector容器中,会覆盖之前的内容
                    res.assign(v.begin(),v.end());
                }
            }else
            {
                break;
            }
        }
    }
    if(res.size()==0)//说明是素数,只有1和本身两个因子
    {
        cout<<1<<"\n"<<n<<endl;
    }else
    {
        cout<<res.size()<<endl;
        for(int i=0;i<res.size();i++)
        {
            cout<<res[i];
            if(i!=res.size()-1)
            {
                cout<<"*";
            }
        }
    }
    return 0;
}
2、L1-020 帅到没朋友

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。

输入格式: 输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式: 按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome。

注意:同一个人可以被查询多次,但只输出一次。

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888


10000 88888 23333
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111

No one is handsome
#include<iostream>
#include<set>//使用set容器,可以保证不重复
using namespace std;

int main()
{
    int n;
    cin>>n;
    set<int>no_handsome;//不帅的人
    for(int i=0;i<n;i++)
    {
        int k;
        cin>>k;
        for(int j=0;j<k;j++)
        {
            int t;
            cin>>t;
            if(k>1)//朋友圈人数>1,说明里面的人一定不帅
            {
                no_handsome.insert(t);
            }
        }
    }
    int m;
    cin>>m;
    set<int>handsome;//存储已经输出的帅的人
    bool flag=true;//标记第一个输出
    for(int i=0;i<m;i++)
    {
        int t;
        cin>>t;
        //find()返回的是一个迭代器指针,如果==end(),说明遍历完容器也没有找到该元素
        if(no_handsome.find(t)==no_handsome.end())//该人帅
        {
            if(handsome.find(t)==handsome.end())//该人没有输出过
            {
                if(!flag)
                {
                    cout<<" ";
                }
                printf("%05d",t);
                flag=false;
            }
            handsome.insert(t);//输出过就加入
        }
    }
    if(handsome.size()==0)//没有输出过
    {
        cout<<"No one is handsome";
    }
    return 0;
}
3、L1-027 出租

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式: 输入在一行中给出一个由11位数字组成的手机号码。

输出格式: 为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

18013820100

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
#include<iostream>
using namespace std;
#include<set>
#include<algorithm>
#include<cstring>
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    char num[12]={0};
    cin.getline(num,sizeof(num));
    set<int>s;
    for(int i=0;num[i]!='\0';i++)
    {
        s.insert(num[i]-'0');//set容器去重
    }
    int arr[s.size()];
    int k=0;
    for(auto it=s.begin();it!=s.end();it++)
    {
        arr[k++]=*it;
    }
    int len=sizeof(arr)/sizeof(int);
    sort(arr,arr+len,cmp);//从大到小排序
    cout<<"int[] arr = new int[]{";
    for(int i=0;i<len;i++)
    {
        if(i!=len-1)//输出格式控制
        {
            cout<<arr[i]<<",";
        }else
        {
            cout<<arr[i];
        }
    }
    cout<<"};"<<endl;
    cout<<"int[] index = new int[]{";
    for(int i=0;num[i]!='\0';i++)
    {
        for(int j=0;j<len;j++)
        {
            if((num[i]-'0')==arr[j])
            {
                if(i!=(int)(strlen(num)-1))
                {
                    cout<<j<<",";
                }else
                {
                    cout<<j;
                }
            }
        }
    }
    cout<<"};";
    return 0;
}
4、L1-032 Left-pad

根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是*****GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。

输入格式: 输入在第一行给出一个正整数N(≤10 4 )和一个字符,分别是填充结果字符串的长度和用于填充的字符,中间以1个空格分开。第二行给出原始的非空字符串,以回车结束。

输出格式: 在一行中输出结果字符串。

15 _
I love GPLT

____I love GPLT


4 *
this is a sample for cut

 cut
#include<iostream>
using namespace std;
#include<string>

int main()
{
    int n;
    char c;
    cin>>n>>c;
    //scanf("%d %c",&n,&c);
    string s;
    getchar();//cin,scanf读取完后会留下'\n'换行符,用getchar()吸收掉
    getline(cin,s);//才能下一步用getline
    int len=s.length();
    if(len>=n)
    {
        string s1=s.substr(len-n,len);
        cout<<s1;
    }else{
        for(int i=0;i<n-len;i++)
        {
            cout<<c;
        }
        cout<<s;
    }
    return 0;
}
5、L1-034 点赞

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。

输入格式: 输入在第一行给出一个正整数N(≤1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为 ”,其中1≤K≤10,F (i=1,⋯,K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔。

输出格式: 统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。

4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123

233 3
#include<iostream>
using namespace std;
#include<algorithm>

int main()
{
    int n;
    cin>>n;
    int nums[10005]={0};//要赋初值为0,后面有++操作
    int flag=0;//标记出现次数最多的标签
    for(int i=0;i<n;i++)
    {
        int k;
        cin>>k;
        for(int j=0;j<k;j++)
        {
            int num;
            cin>>num;
            nums[num]++;
            //核心是次数大优先,次数一样则下标大优先
            if(nums[num]>nums[flag])
            {
                flag=num;
            }else if(nums[num]==nums[flag])
            {
                if(num>flag)
                {
                    flag=num;
                }
            }
        }
    }
    cout<<flag<<" "<<nums[flag];
    
    return 0;
}
上一篇:初级算法-与数组相关的题
下一篇:没有了
网友评论