1.简单模拟
- 简单模拟——1
#include<iostream>
using namespace std;
int main(){
int n,roundNum=0;
cin>>n;
while(n!=1){
roundNum++;
if(n%2==0) n/=2;
else n=(3*n+1)/2;
}
cout<<roundNum<<endl;
return 0;
}
- 简单模拟——2
#include<iostream>
using namespace std;
int main(){
int n,index,mark,maxIndex=0,maxMark=0;
cin>>n;
int record[n]={0};
for(int i=0;i<n;i++){
cin>>index>>mark;
record[index-1]+=mark;
if(record[index-1]>maxMark){
maxMark=record[index-1];
maxIndex=index;
}
}
cout<<maxIndex<<" "<<maxMark<<endl;
return 0;
}
2.查找元素
#include<iostream>
using namespace std;
int main(){
int n,m;
loop:while(cin>>n){
int arr[n];
for(int i=0;i<n;i++) cin>>arr[i];
cin>>m;
for(int i=0;i<n;i++)
if(arr[i]==m) {cout<<i<<endl; goto loop;}
cout<<"-1"<<endl;
}
return 0;
}
3.图形输出
#include<iostream>
using namespace std;
int main(){
int n,m;
char c;
cin>>n>>c;
if(n%2==0) m=n/2;
else m=n/2+1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
if(i==0||i==m-1) cout<<c;
else
if(j==0||j==n-1) cout<<c;
else cout<<' ';
cout<<endl;
}
return 0;
}
4.日期处理
碰到日期差值问题最一般的思路,就是从较小的日期开始每次加一天,当天数超过当前月份天数时月份加一,当月份数超过12时,年数加一。注意平年闰年。
#include<iostream>
#include<string>
using namespace std;
int arr[]={31,28,31,30,31,30,31,31,30,31,30,31};
int isLeapYear(int year){
return (year%400==0||(year%4==0&&year%100!=0));
}
int main(){
string s1,s2,temp;
int y1,m1,d1,y2,m2,d2,result=1;
cin>>s1>>s2;
temp=s1;
s1=s1<s2? s1:s2;
s2=s1==temp? s2:temp;
y1=stoi(s1.substr(0,4));
y2=stoi(s2.substr(0,4));
m1=stoi(s1.substr(4,2));
m2=stoi(s2.substr(4,2));
d1=stoi(s1.substr(6,2));
d2=stoi(s2.substr(6,2));
if(isLeapYear(y1)) arr[1]=29;
else arr[1]=28;
while(y1<y2||m1<m2||d1<d2){
if(d1<arr[m1-1]) d1++;
else{
d1=1;
if(m1<12) m1++;
else{
m1=1;
y1++;
if(isLeapYear(y1)) arr[1]=29;
else arr[1]=28;
}
}
result++;
}
cout<<result<<endl;
return 0;
}
5.进制转换
自己出了一个小题
要求:
- 通过输入函数标号0或1,与操作数num与radix。
- 当函数标号为0时,则将radix进制数num转换成10进制;
- 当函数标号为1时,则将10进制数num转换为radix进制。
注:数字中所有字母均为小写字母,当输入数字中有大写字母时自动转为小写字母。程序以输入ctrl+z结束。
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
vector<int> v;
//10进制转radix进制
void trans10_radix(int num, int radix){
v.clear();
while(1){
v.push_back(num%radix);
num/=radix;
if(num==0) break;
}
}
//radix进制转10进制
int transradix_10(string num, int radix){
int result=0,e=1,current;
for(int i=num.length()-1;i>=0;i--){
char c=tolower(num[i]);
if(c<='z'&&c>='a') current=c-87;
else current=c-48;
result+=current*e;
e*=radix;
}
return result;
}
int main(){
cout<<"输入0代表由给定进制转换到10进制;"<<endl;
cout<<"输入1代表由10进制转换到给定进制;"<<endl;
int cal;
cout<<"请输入0或1: ";
while(cin>>cal){
cout<<"请输入操作数num与进制radix,用空格隔开: ";
if(!cal){
string num;
int radix;
cin>>num>>radix;
cout<<"结果为:"<<transradix_10(num,radix)<<endl;
}
else{
int num,radix;
cin>>num>>radix;
trans10_radix(num,radix);
cout<<"结果为:";
for(int i=v.size()-1;i>=0;i--)
if(v[i]>=10) cout<<(char)(v[i]+87);
else cout<<v[i];
cout<<endl;
}
cout<<"请输入0或1: ";
}
return 0;
}
运行结果:
输入0代表由给定进制转换到10进制;
输入1代表由10进制转换到给定进制;
请输入0或1: 0
请输入操作数num与进制radix,用空格隔开: abc 17
结果为:3089
请输入0或1: 1
请输入操作数num与进制radix,用空格隔开: 3089 17
结果为:abc
请输入0或1: 0
请输入操作数num与进制radix,用空格隔开: ab1c 18
结果为:61914
请输入0或1: 1
请输入操作数num与进制radix,用空格隔开: 61914 18
结果为:ab1c
请输入0或1: ^Z
6.字符串处理
- 字符串处理——1
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main(){
string str,str1;
cin>>str;
str1=str;
reverse(str.begin(), str.end());
if(str1==str) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
- 字符串处理——2
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
vector<string> v;
string word;
while(cin>>word) v.push_back(word);
for(int i=v.size()-1;i>=0;i--)
if(i==0) cout<<v[i]<<endl;
else cout<<v[i]<<" ";
return 0;
}