A - 1001 害死人不偿命的(3n+1)猜想
题意
求一个数经过题中操作变为1的步数
思路
1.判断是偶数还是奇数
坑点
1.无
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,cnt=0;//n一个数,cnt计算步数
int main()
{
cin>>n;//输入这个数 n
while(n!=1)//当n!=1时进入循环
{
if(n%2==0)//是偶数时
{
n/=2;//进行n/2的操作
cnt++;//步数++
}
else//是奇数时
{
n=(3*n+1)/2;//进行此操作
cnt++;//步数++
}
}
cout<<cnt;//输出步数
return 0;
}
总结
难度简单,while循环,if判断
B - 1002 写出这个数
题意
1.用汉字拼音写出每一位数
思路
1.将数转换为拼音字符串
2.遍历求和
坑点
1.输出的个位数字后不含空格
2.数的范围很大,开longlong也不够
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
string s;//数的范围太大需要用到字符串
int sum=0,j=0;//sum计算所有数的和,j表示sum一共几位
cin>>s;//用字符串来读入数
int f[1000];//存储各位的数
string a[10];//定义一个字符串数组存储 0-9 各个数字对应的拼音
a[0]="ling";
a[1]="yi";
a[2]="er";
a[3]="san";
a[4]="si";
a[5]="wu";
a[6]="liu";
a[7]="qi";
a[8]="ba";
a[9]="jiu";
for(int i=0;i<s.length();i++)
{
sum+=s[i]-'0';//转换成字符
}
while(sum>0)
{
f[j]=sum%10;//最先计算出个位
j++;//计算几次 %操作,也就是计算是一个几位数
sum=sum/10;
}
for(int i=j-1;i>0;i--)//倒序输出
{
cout<<a[f[i]]<<" ";//输出除去个位的各个数
}
cout<<a[f[0]];//最后输出个位上的数
}
总结
难度中等,对于字符串与数字之间的转换掌握较差,循环
C - 1003 我要通过!
题意
判断字符串是否符合题中规则
思路
1.找到规律
坑点
1.无
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
int n,p=0,t=0;
string s;
int main()
{
cin>>n;//n组数据
for(int i=0;i<n;i++)
{
cin>>s;//读入该字符
map<char,int>mp;//存储字符
for(int j=0;j<s.size();j++)
{
mp[s[j]]++;//存储不同的字符出现了几次
if(s[j]=='P')//当字符==P时
{
p=j;//用p来标记P出现的位置
}
if(s[j]=='T')//当字符等于T时
{
t=j;//用t来标记T出现的位置
}
}
if(mp['P']==1&&'A'!=0&&mp['T']==1&&mp.size()==3&&t-p!=1&&p*(t-p-1)==s.length()-t-1)
//规则为 P,T只出现一次,不能不含A,字符串内不同字符数量只能为 3,
//T出现的位置的下标减去P出现的位置的下标不可能等于1; T-P位置的下标之前的长度*2=T位置后面的长度
{
printf("YES\n");//符合规则,输出YES
}
else{
printf("NO\n");//不符合规则,输出NO
}
}
return 0;
}
总结
难度中等,思维较差,题意花很长时间才看懂,需熟练掌握map函数
D - 1004 成绩排名
题意
1.分别输出最高和最低成绩学生的姓名和学号
思路
1.输入多组学生的姓名、学号、成绩
2.按成绩进行排序
坑点
1.无
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct name{
string xm;//姓名
string xh;//学号
int cj;//成绩
}a[10005];//用数组a来存储
bool cmp(name x,name y)
{
return x.cj>y.cj;//成绩高的排在前面
}
int main()
{
cin>>n;//输入n组
for(int i=0;i<n;i++)//遍历输入每组的姓名,学号,成绩
{
cin>>a[i].xm>>a[i].xh>>a[i].cj;
}
sort(a,a+n,cmp);//用上面结构体中的进行排序
cout<<a[0].xm<<" "<<a[0].xh<<endl;//先输出第一名的姓名和学号
cout<<a[n-1].xm<<" "<<a[n-1].xh; //最后输出最后一名的姓名和学号
return 0;
}
总结
难度简单,结构体排序
E - 1005 继续(3n+1)猜想
题意
从大到小输出关键数
思路
1.输入k个数
2.找到关键数
3.从大到小输出
坑点
1.输出的最后一个数后没有空格
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;//降序
}
int main()
{
int K,flag=0;
cin>>K;//K个数
int a[10000]={0};
vector<int> v;
for(int i=0;i<K;i++)
{
int tmp;//读入这些数
cin>>tmp;
v.push_back(tmp) ;//将这些数插入到 v 中
while(tmp!=1)//不等于1时
{
if(tmp%2==1)//为奇数时
{
tmp=3*tmp+1;
}
if(tmp%2==0)//为偶数时
{
tmp/=2;
}
if(a[tmp]==0)//不被包含
{
a[tmp]=1;//赋值为1 ,做标记
}
}
}
sort(v.begin() ,v.end() ,cmp);//排序
for(int i=0;i<v.size() ;i++)//遍历
{
if(a[v[i]]==0)//不被包含
{
if(flag==1)//状态为1时
{
cout<<" ";//可以避免最后一个数后有空格
}
cout<<v[i];//输出找到的数
flag=1;
}
}
return 0;
}
总结
难度较难,题目花很长时间才看懂,需提高思维能力,对于vector的用法不熟悉,需熟练掌握vector的用法