目录
1001 害死人不偿命的(3n+1)猜想
递归即可,没有用到太多东西
#include<iostream>
using namespace std;
int main()
{
int n=0;
cin>>n;
int count=0;
while(n>1)
{
if(n%2==0)
{
n=n/2;
count++;
}
else
{
int temp=n*3+1;
n=temp/2;
count++;
}
}
cout<<count;
}
1002 写出这个数
水题,大概三个简单知识点:
(1)getline(cin,s)
函数原型istream& getline ( istream &is , string &str , char delim );
&is表示一个输入流,&str为用于存放输入流的字符串,delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符
(2)sum+=x-'0'
对char累加时记得-'0'
(3)for(auto i=Sum.begin();i!=Sum.end();i++)
string的begin()与end()的使用
#include<iostream>
using namespace std;
int main()
{
string a;
int sum=0;
getline(cin,a);
for(auto x:a)
{
sum+=x-'0';
}
string Sum=to_string(sum);
for(auto i=Sum.begin();i!=Sum.end();i++)
{
switch(*i)
{
case '1':cout<<"yi";break;
case '2':cout<<"er";break;
case '3':cout<<"san";break;
case '4':cout<<"si";break;
case '5':cout<<"wu";break;
case '6':cout<<"liu";break;
case '7':cout<<"qi";break;
case '8':cout<<"ba";break;
case '9':cout<<"jiu";break;
case '0':cout<<"ling";break;
}
if(i!=Sum.end()-1) cout<<" ";
}
}
1004 成绩排名
包含<algorithm>以及<vector>后,用容器储存所有学生,用sort()函数对结构体进行排序即可;
sort()有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,我这里写了;
如果不写的话,默认从小到大进行排序;
如果想从大到小排序可以将cmp参数写为greater<int>()就是对int数组进行排序,<>中也可以写double、long、float等其他类型。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct student
{
string name;
string number;
int score;
};
bool cmp(student a,student b)
{
return a.score>b.score;
}
int main()
{
int n;
cin>>n;
vector<student> a;
for(int i=0;i<n;i++)
{
student stu;
cin>>stu.name>>stu.number>>stu.score;
a.push_back(stu);
}
sort(a.begin(),a.end(),cmp);
cout<<a[0].name<<" "<<a[0].number<<endl;
cout<<a[n-1].name<<" "<<a[n-1].number;
}
1005 继续(3n+1)猜想
对数列中的每个数都进行卡拉兹运算,再将产生的中间数t与数列中其他的数相比较。如果相等,则可以称该数被覆盖。则用数组HashTable标记1,则标记1的数为非关键数,其余的数为关键数。最后用vector容器储存关键数,顺便用自带的sort函数进行排序。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
cin>>n;
int t;
int k[n];
int HashTable[n]={0};
vector<int> keynum;
for(int i=0;i<n;i++)
{
cin>>k[i];
}
for(int i=0;i<n;i++)
{
t=k[i];
while(t!=1)
{
if(t%2==0)
t=t/2;
else
t=(3*t+1)/2;
for(int j=0;j<n;j++)
{
if(k[j]==t)
HashTable[j]=1;//被覆盖
}
}
}
for(int i=0;i<n;i++)
{
if(HashTable[i]!=1)
keynum.push_back(k[i]);
}
sort(keynum.begin(),keynum.end(),cmp);
for(int i=0;i<keynum.size();i++)
{
if(i==0)
cout<<keynum[i];
else
cout<<" "<<keynum[i];
}
}
1006 换个格式输出整数
水题
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[3]={0};
for(int i=0;n!=0;i++)
{
a[i]=n%10;
n=n/10;
}
for(int i=0;i<a[2];i++)
cout<<"B";
for(int i=0;i<a[1];i++)
cout<<"S";
for(int i=0;i<a[0];i++)
cout<<i+1;
}
1007 素数对猜想
用pre和i两个变量(pre代表旧的素数,i寻找新的素数)。之后每找到一个素数便和前一个素数比较,将新的素数i赋值给pre,这样仅用2个变量就能遍历所有的素数;
这样就能达到优化时间复杂度的目的。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
int pre=2;
int j;
int counter=0;
for(int i=2;i<=n;i++)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)
break;
}
if(j>sqrt(i)) //确保i是素数,因为上面一个for循环中非素数也跳出来了
{
if(i-pre==2)
{
counter++;
}
pre=i;
}
}
cout<<counter;
}
1008 数组元素循环右移
将输入的数字存在容器v1里,循环右移n个则弹出n个元素储存在新的容器v2;
最后将v2逆序(reverse)输出,再将原容器正序输出。
(1)容器vector的内置操作函数,
v.pop_back();//删除数组最后一个数
v.pop_front();//删除新数组最前的一个数
v.push_back(i);//在新数组最后面加一个数
v.push_front(i);//在新数组最前面加一个数
(2)
begin()返回一个当前vector容器中起始元素的迭代器;
front()返回当前vector容器中起始元素的引用;
end()返回一个当前vector容器中末尾元素的迭代器;
是vector最后一个元素后的结束元素
back()返回当前vector容器中末尾元素的引用;
类比字符串,end( )返回的是’\0’,back( )返回的是字符串的最后一个字符
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int N,M;
cin>>N>>M;
int t;
vector<int> v1;
vector<int> v2;
M=M%N;//关键所在,因为没有规定移动长度不得大于数组长度
while(N--)
{
cin>>t;
v1.push_back(t);//将数组移动至容器v1
}
while(M--)
{
t=v1.back();
v2.push_back(t);//移动至v2
v1.pop_back();//在v1中删除
}
reverse(v2.begin(),v2.end());
for(auto x:v2)
cout<<x<<" ";
for(auto it=v1.begin();it!=v1.end();it++)
{
if(it==v1.end()-1)
cout<<*it;
else
cout<<*it<<" ";
}
}
1009 说反话
使用reverse和容器就很简单了;
要注意的是
char c=getchar();
if(c=='\n')
break;
的使用,当程序调用getchar()时,相当于检索t后面的字符,这时要么是空格要么是回车,如果是空格则继续,如果是回车则break跳出循环,结束输入。
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int main()
{
string s;
vector<string> v;
while(cin>>s)
{
v.push_back(s);
char c=getchar();
if(c=='\n')
break;
}
reverse(v.begin(),v.end());
for(auto it=v.begin();it!=v.end();it++)
{
if(it==v.begin())
cout<<*it;
else
cout<<" "<<*it;
}
}
1010 一元多项式求导
while(cin>>a>>b)以及getchar()帮助连续输入;
first的设立是为了防止常数项。
#include<iostream>
using namespace std;
int main()
{
int a,b;
bool first=1;
while(cin>>a>>b)
{
if(b!=0)
{
if(first==1)
{
cout<<a*b<<" "<<b-1;
first=0;
}
else
cout<<" "<<a*b<<" "<<b-1;
char c=getchar();
if(c=='\n')
break;
}
}
if(first==1)
cout<<"0 0";
return 0;
}