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;
}