输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
567
思路 :
题目要求输入一个数,输出最长的最小连续因子,而输出数据特征:起始值,连续长度。由于数N在【sqrt(N),N】不可能存在连续因子,所以我们只需在【2,sqrt(N)】区间以不同的起始值,更新最终起始值(start)和连续因子长度(maxcount)即可
注意:对于素数,连续因子就是本身,且长度为1(测试点5/6)
#include
#include
using namespace std;
int main() {
int N, temp;
int count = 0, maxcount = 0, start = 0;
cin >> N;
for (int i = 2; i <= sqrt(N) ; i++) {
temp = N;
count = 0;
int j = i;
while (temp%j==0) {
temp /= j++;
count++;
}
if (count > maxcount) {
maxcount = count;
start = i;
}
}
if (maxcount) {
cout << maxcount << endl;
for (int i = 0; i < maxcount; i++) {
cout << start + i;
if (i != maxcount - 1)
cout << "*";
}
}
else
cout <<"1"<<endl<< N;
return 0;
}
L1-009 N个数求和
L1-011 A-B
这题也是水题 但了解到了C++里String库中replace方法所以记录一下
利用getline方法可以解决把空格视作结束标志的问题
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
string a,b;
getline(cin,a);
getline(cin,b);
int num1=a.size();
int num2=b.size();
for(int i=0;i<num2;i++)
{
for(int j=0;j<num1;j++)
{
if(a[j]==b[i])
{
a.replace(j,1,"");
j--;
}
}
}
cout<<a;
return 0;
}
L1-015 跟奥巴马一起画方块
这题主要是四舍五入算法 查了一下 没看懂- - 麻烦懂的大神指教一下
2.1 2.6 -2.1 -2.6
floor : 不大于自变量的最大整数 2 2 -3 -3
ceil :不小于自变量的最大整数 3 3 -2 -2
round:四舍五入到最邻近的整数 2 3 -2 -3
floor(),ceil() 需包含头文件<math.h>
C++中没有直接的round函数 需自己建立
double round(double r)
{
return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int round_double(double number)
{
return (number > 0.0) ? (number + 0.5) : (number - 0.5);
}
int main()
{
double n;
char c;
cin>>n>>c;
float rows=round_double(n/2);
for(int i=1;i<=rows;i++)
{
for(int j=1;j<=n;j++)
{
cout<<c;
}
cout<<endl;
}
return 0;
}
L1-016 查验身份证
这题想放一下主要是因为第一次测试的时候测试点2没通过 然后发现结尾是X的话就算身份证正确也会被认为是错误的 找了半个小时发现是int校检码数组时X会被认为是88 而X-‘0’是40 这是调整了一下四个测试点全过了
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
char a[20];
int b[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},c[]={1,0,40,9,8,7,6,5,4,3,2};
int n,flag=0;
cin>>n;
while(n--)
{
cin>>a;
int flag1=0;
int sum=0;
for(int i=0;i<17;i++)
{
sum+=(a[i]-'0')*b[i];
if(a[i]>'9'||a[i]<'0')
{flag1=1;
break;}
}
int z=sum%11;
if(((a[17]-'0')!=c[z])||flag1)
{
cout<<a<<endl;
flag=1;
}
}
if(flag==0)
cout<<"All passed"<<endl;
return 0;
}
L1-017 到底有多二
这题写了有点久 下楼吃了个夜宵回来就出来了- -夜间不适合A题
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
char s[51];
float zf=1,jo=1;
int count=0;
cin>>s;
int k=0;
for(int i=0;s[i]!='\0';i++)
{
k++;
}
if(s[0]=='-')
{zf=1.5;
k--;}
if(s[0]!='-')
{if(s[k-1]%2==0)
jo=2;}
else
if(s[k]%2==0)
jo=2;
for(int i=0;i<k;i++)
{
if(s[i]=='2')
count++;
}
float sum;
sum=(count*zf*jo)/k*100;
printf("%.2f%%",sum);
return 0;
}
L1-020 帅到没朋友
记这题是因为自己写的代码只通过两个测试点 而且最后一个测试点提示超时
看了一下大神的代码换了一下思路
#include
int main()
{
int Person[100000]={0};
int N,n,m;
int K;
int i,j;
int sum=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&n);
for(j=1;j<=n;j++)
{
scanf("%d",&m);
if(n!=1)
Person[m]+=n;
}
}
scanf("%d",&K);
for(i=1;i<=K;i++)
{
scanf("%d",&m);
if(Person[m]==0)
{
if(sum!=0)
printf(" ");
printf("%05d",m);
Person[m]=-1;
sum++;
}
}
if(sum==0)
printf("No one is handsome");
printf("\n");
return 0;
}
解本题主要思想:将题目从相对复杂的情况,变成非常简单的计数问题
L1-025 正整数A+B
L1-027 出租
这题主要是想办法从电话号码中得到一个从大到小排列且不重复的arr[] 还是看了一下大神的代码才换一种思路 不得不说对我这种小白简直是顿悟
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
string s;
int a[10]={0},index[10],num=0;
cin>>s;
for(int i=0;i<11;i++)
{
a[s[i]-'0']++;
}
int arr[10],j=0;
printf("int[] arr = new int[]{");
for(int i=9;i>=0;i--)
{
if(a[i]!=0)
{arr[j]=i;
if(j!=0)
cout<<",";
cout<<arr[j];
j++;
}
}
printf("};\n");
printf("int[] index = new int[]{");
for(int i=0;i<s.size();i++)
{
for(int m=0;m<j;m++)
{
if(s[i]-'0'==arr[m])
{
index[num]=m;
if(num!=0)
cout<<",";
cout<<index[num];
num++;
}
}
}
printf("};\n");
return 0;
}
L1-028 判断素数
这题是因为0和1不是质数也不是合数
质数定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int isPrime(ll x)
{
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int n;
ll x;
cin>>n;
while(n--)
{
cin>>x;
if(isPrime(x)&&x!=0&&x!=1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
L1-033 出生年
这题先放了一会后来才做的 第一眼看的时候觉得太麻烦了 后来看看通过率也不是什么神题 看了下大神的代码换了个思路就出来了
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
int y,n;
cin>>y>>n;
int k=y;
while(1)
{
int sum=0,a[10]={0};
int num[4]={0};
num[0]=k/1000;
num[1]=k/100%10;
num[2]=k/10%10;
num[3]=k%10;
for(int i=0;i<4;i++)
{
a[num[i]]++;
}
for(int i=0;i<10;i++)
{
if(a[i]!=0)
sum++;
}
if(sum==n)
break;
k++;
}
printf("%d %04d",k-y,k);
return 0;
}
L1-034 点赞
本题思路:建一个数组直接判断每个数出现的次数,出现多的覆盖掉出现少的,如果次数一样那就判断数的大小,谁大记录谁
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int n,k,b,a[1001]={0},maxcount=0,j=0;
cin>>n;
while(n--)
{
cin>>k;
for(int i=0;i<k;i++)
{
cin>>b;
a[b]++;
if(a[b]>maxcount)
{
maxcount=a[b];
j=b;
}
else if(a[b]==maxcount)
{
if(b>j)
{
maxcount=a[b];
j=b;
}
}
}
}
cout<<j<<" "<<a[j]<<endl;
return 0;
}
在本段代码里a数组负责存放输入数字出现过的次数,maxcount记录一个数字最多出现几次,而j负责记录那个出现最多的数的下标
L1-035 情人节
本题是再一次使用string类型 所以记录一下 这里发现字符串前不能像int一样在变量前直接用! 还有最后如果用printf输出的话 需要用.c_str() 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
string s,a,b;
int i=0;
while(cin>>s)
{
if(s==".")
break;
i++;
if(i==2)
{
a=s;
}
if(i==14)
b=s;
}
if(i>=14)
{
cout<<a<<" and "<<b<<" are inviting you to dinner..."<<endl;
}
else if(i>=2)
{
cout<<a<<" is the only one for you..."<<endl;
}
else
{
cout<<"Momo... No one is for you ..."<<endl;
}
return 0;
}
L1-039 古风排版
这题坑很多 自己写了一个小时才A掉 菜是原罪
总结一下:如果字符串长度不是n的倍数,则输出空格补全 这里我是在纸上列了一下找了一下规律
T h i s i s a t e s t c a s e
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
a s a T 16 12 8 4 0 这里给大家列出规律应该就不难了,每n个
s t i h 17 13 9 5 1 数字进行换行,每行开头的数字与后一位差
e t s i 18 14 10 6 2 n,所以本题主要在于开头这个数字如何获得
c e s 19 15 11 7 3 考虑完以上综合因素,便能A题了
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int n;
string s;
cin>>n;
getchar();
getline(cin,s);
int l=s.size();
int m=l%n;
int p=l/n;
if(m!=0)
for(int i=0;i<n-m;i++)
{
s+=" ";
}
int i=(m==0)?(p-1)*n:p*n;
int q=0;
for(i;q<n;i++,q++)
{
for(int j=i;j>=0;j-=n)
{
cout<<s[j];
}
cout<<endl;
}
return 0;
}
这里贴一个某位大佬对本题坑点的分析
L1-043 阅览室
本题有几个坑 改了几次才全A掉 这里我标一下
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
int n,no,h,m,time[1001],flag[1001]={0},cnt;
double totaltime;
char a;
cin>>n;
while(n--)
{
totaltime=0,cnt=0;
while(1)
{
scanf("%d %c %d:%d",&no,&a,&h,&m);
if(no==0)
break;
else if(a=='S')
{
flag[no]=1;
time[no]=h*60+m;
}
else if(a=='E'&&flag[no]==1)
{
totaltime+=h*60+m-time[no];
cnt++;
time[no]=0;
flag[no]=0;
}
}
if(cnt==0)
cout<<"0 0"<<endl;
else
cout<<cnt<<" "<<int(totaltime/cnt+0.5)<<endl;
}
return 0;
}
L1-044 稳赢
本题很简单但自己不够细心 提交第5次才A掉 都是一些小地方没考虑到
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int k;
cin>>k;
string s;
int n=k;
while(cin>>s)
{
if(s=="End")
break;
if(n==0)
{
cout<<s<<endl;
n=k+1;
}
else if(s=="ChuiZi")
cout<<"Bu"<<endl;
else if(s=="JianDao")
cout<<"ChuiZi"<<endl;
else
cout<<"JianDao"<<endl;
n--;
}
return 0;
}
L1-046 整除光棍
这题写出来后我自己都在笑自己 本来按自己思路写了一下发现测试点1 2超时了- -意料之中 然后看了一下其他人的代码 知道一个模拟竖式除法的方式 查了一下竖式除法原来就是小学算术这玩意 心态崩了
#include
using namespace std;
int main()
{
int x,s=0,n=0;
cin>>x;
while(s<x)
{
s=s*10+1;
n++;
}
while(true)
{
cout<<s/x;
s%=x;
if(s==0)break;
s=s*10+1;
n++;
}
cout<<' '<<n;
return 0;
}
L1-048 矩阵A乘以B
15分的题居然又让我写了一个多小时 手动狗头
做这题还先要了解一下矩阵乘法是个什么东西
看懂了之后就可以开始写代码了 前面输入数组的部分就不说了
我们主要来看看矩阵乘法求和部分
可以看到第40行代码是一条公式 如何构造出我们需要的循环就成为了一个难点,由输出样例我们可以得到一个两次的大循环,一个四次的内循环,但得到一个数还需要3次相乘,即a数组的列数,所以我们再建立一个三次的小循环,而在这一层循环中,最重要的是找到数组下标间的关系,写出正确的关系式后便能AC了
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
int rowa,cola,rowb,colb;
cin>>rowa>>cola;
int a[rowa][cola];
for(int i=0;i<rowa;i++)
{
for(int j=0;j<cola;j++)
{
cin>>a[i][j];
}
}
cin>>rowb>>colb;
int b[rowb][colb];
for(int i=0;i<rowb;i++)
{
for(int j=0;j<colb;j++)
{
cin>>b[i][j];
}
}
if(cola==rowb)
{
cout<<rowa<<" "<<colb<<endl;
for(int m=0;m<rowa;m++)
{
for(int n=0;n<colb;n++)
{
int sum=0;
for(int i=0;i<cola;i++)
{
sum+=a[m][i]*b[i][n];
}
if(n!=0)
cout<<" ";
cout<<sum;
}
cout<<endl;
}
}
else
printf("Error: %d != %d",cola,rowb);
return 0;
}
L1-049 天梯赛座位分配
这题本来看不懂 就放了两天 一阶段的题做的差不多了又回来看还是看不懂题目的意思- -菜的不行 比如为什么到80之后就只有82 84,81 83去哪里了 于是看了超多大神的代码 开始有点理解到80的时候就是题目所说的只剩下一个学校的时候 隔位坐,并且可以看到输入的各个学校队伍数即为每行的行数,那这样就可以开始写代码了
说一下大神的思路:记录下队伍数的最大值 遍历的时候会用到它,把每个学校所需要的位置数标记为1
遍历的时候外层为所有学校的最多选手,内层循环为第i所学校,首先它得被标记过 用一个flag标记它的上一个学校是不是跟他一样 ,一样的话说明只剩下他一所学校了,即隔位cnt+2 否则cnt+1
输出的时候判断下就ok了
这里重点提醒一下 memset这个函数必须要使用 否则第五个测试点无法通过 具体原因我也不太清楚 还是要多刷题
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int a[101][101],n,m,max=0;
memset(a,0,sizeof(a));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m;
if(m>max)
max=m;
for(int j=1;j<=m*10;j++)
{
a[i][j]=1;
}
}
int cnt=0,flag=0;
for(int i=1;i<=max*10;i++)
{
for(int j=1;j<=n;j++)
{
if(a[j][i])
{
if(flag!=j)
{
cnt++;
a[j][i]=cnt;
flag=j;
}
else
{
cnt+=2;
a[j][i]=cnt;
flag=j;
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<"#"<<i<<endl;
for(int j=1;j<=max*10;j++)
{
if(a[i][j])
{
cout<<a[i][j];
if(j%10==0)
cout<<endl;
else
cout<<" ";
}
}
}
return 0;
}
L1-050 倒数第N个字符串
这道题虽说就15分 但在我眼里和上一题是一样的存在- - 这次学了一下vector怎么使用 暂时理解为动态数组 可以存放任何类型的数据
L1-054 福到了
这道题对输入格式的要求很高,如果会用scanf和gets那就很简单了 我不会用gets所以用了scanf- - 测试了一下scanf是可以将空格当成char读入的
突然想到还有个比较重要的点 像这样的输入一定要用getchar()来吸收掉回车,不然会影响输入的
本题思路:其实很简单 把一个数组倒序输出就好了 但如何判断是否不用倒了我看了一下其他人的代码 然后一直在想为什么直接在第一个大循环里判断是否相同为什么不行,后来发现如果这样做会导致getchar使用出现错误 导致WA 还是老实点再建一个循环判断好了
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
int n,flag=0;
char a[111][111],x;
cin>>x>>n;
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]!=' ')
{
a[i][j]=x;
}
}
getchar();
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]!=a[n-i-1][n-j-1])
flag=1;
}
}
if(!flag)
cout<<"bu yong dao le"<<endl;
for(int i=n-1;i>=0;i--)
{
for(int j=n-1;j>=0;j--)
{
cout<<a[i][j];
if(j==0)
cout<<endl;
}
}
return 0;
}
L1-058 6翻了
又是做了一小时的题目- -做到后期心态都快崩了 15分的题怎么会这么难 A掉后看了一下通过率 还好还好 不过思路至少是正确的
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
string s;
int cnt=0,k;
getline(cin,s);
for(int i=0;i<=s.size();i++)
{
if(s[i]=='6')
{
k=i;
cnt++;
}
else if(cnt<=3)
cnt=0;
else{
if(cnt>3&&cnt<=9)
{
s.replace(k-cnt+1,cnt,"9");
i=i-cnt;
cnt=0;
}
if(cnt>9)
{
s.replace(k-cnt+1,cnt,"27");
i=i-cnt;
cnt=0;
}
}
}
cout<<s<<endl;
return 0;
}
L1-059 敲笨钟
半小时左右出来了- -但是后来改改改 到最后还是有个测试点没通过,报错提示是运行时错误 经过多次提交怀疑是compare函数的问题 改了一下果然能A了
有些大神好像使用正则表达式写的 我还是有点看不太懂就没去用 我太菜了
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
int n,k1,k2,k,l;
string s;
cin>>n;
getchar();
while(n--)
{
getline(cin,s);
k1=s.find(",");
k2=s.find(".");
if(s[k1-1]!='g'||s[k1-2]!='n'||s[k1-3]!='o'||s[k2-1]!='g'||s[k2-2]!='n'||s[k2-3]!='o')
{
cout<<"Skipped"<<endl;
}
{
cout<<"Skipped"<<endl;
}
else
{
int ans=0;
for(int i=k2-1;;i--)
{
if(s[i]==' ')
ans++;
if(ans==3)
{
k=i+1;
l=k2-k;
break;
}
}
s.replace(k,l,"qiao ben zhong");
cout<<s<<endl;
}
}
return 0;
}
L2-001 紧急救援
待我学完最短路再来- - 没学过完全看不懂代码