1003 翻转数的和
解法1:用字符串进行处理
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
long num_1, num_2;
//输入反转数
while (cin >> num_1 >> num_2) {
string s1 = to_string(num_1);
string s2 = to_string(num_2);
string reverse_num1 = "";
string reverse_num2 = "";
//逆置字符串
for (int i = s1.length() - 1; i >= 0; i--)
{
reverse_num1.push_back(s1[i]);
}
for (int i = s2.length() - 1; i >= 0; i--)
{
reverse_num2.push_back(s2[i]);
}
//将字符串转换为整型
long final_number1 = stol(reverse_num1);
long final_number2 = stol(reverse_num2);
//输出答案
cout << final_number1 + final_number2<<endl;
}
return 0;
}
解法2:用数学方法进行处理
#include<iostream>
using namespace std;
int main() {
long num1, num2;
while (cin >> num1 >> num2) {
long ans1 = 0;
long ans2 = 0;
while (num1 > 0)
{
ans1 = ans1 * 10;
ans1 = ans1 + (num1 % 10);
num1 = num1 / 10;
}
while (num2 > 0)
{
ans2 = ans2 * 10;
ans2 = ans2 + (num2 % 10);
num2 = num2 / 10;
}
cout << ans1 + ans2 << endl;
}
return 0;
}
注意: 当提示需要有多组案例输入时,请使用 while (cin >> num1 >> num2)
1008 0和1的个数
#include<iostream>
using namespace std;
#include<vector>
int main() {
int n;
int count0 = 0;
int count1 = 0;
//声明一个32位全零数组
vector<int> arr(32,0);
cin >> n;
//声明一个数组来接收这个二进制数
vector<int> num;
//将10进制转换为2进制 如将10转为 0101 反序输出时才是正确2进制数
while (n>0)
{
num.push_back(n % 2);
n = n / 2;
}
//将二进制数数组填入32位全零数组
auto it1 = arr.begin();
for ( auto it = num.begin(); it !=num.end() ; it++)
{
*it1 = *it;
it1++;
}
//遍历修改过的32位全0数组
for (auto it = arr.begin(); it!=arr.end() ; it++)
{
if (*it == 0) {
count0++;
}
else
{
count1++;
}
}
cout << "count0=" << count0 << " " << "count1=" << count1 << endl;
return 0;
}
注意: 注意如何将十进制数转化为二进制数
//将10进制转换为2进制 如将10转为 0101 反序输出时才是正确2进制数
while (n>0)
{
num.push_back(n % 2);
n = n / 2;
}
1027 删除字符串
#include<iostream>
using namespace std;
#include<string>
int main() {
string s;
getline(cin, s);
for (int i = 0; i < (s.length()-2); i++)
{
string str = s.substr(i, 3);
if (str=="gzu"|| str == "gzU" || str == "gZu" || str == "gZU" || str == "Gzu" || str == "GzU" || str == "GZu" || str == "GZU" )
{
s.erase(i, 3);//从第i个位置起删3个字符
}
}
cout << s<<endl;
return 0;
}
本题使用了string两个常用的操作
substr(i,3) 从第i个位置起截取3个字符
s.erase(i, 3);//从第i个位置起删3个字符
1240 首字母大小写
#include<iostream>
using namespace std;
#include<string>
int main() {
string s;
while (getline(cin, s)) {
if (s[0] <= 'z' && s[0] >= 'a')
{
s[0] = s[0] - 32;
}
for (int i = 0; i < s.length(); i++)
{
if (s[i] == ' ' || s[i] == '\t' || s[i] == '\r' || s[i] == '\n') {
if (s[i+1] <= 'z' && s[i+1] >= 'a')
{
s[i+1] -= 32;
}
}
}
cout << s << endl;
}
return 0;
}
需要记住的是,字符型变量可以直接加减数字. 并且小写字母的ascii码值要比对应的大写字母多32
1259 十六进制转十进制
以下是十六进制字符串转十进制的常用方法 需要掌握
#include<iostream>
using namespace std;
#include<string>
int main() {
string sixteen_number;
while (cin >> sixteen_number) {
int sum = 0;
for (int i =2; i < sixteen_number.length(); i++)
{
sum = sum * 16;
if (sixteen_number[i]>='A' && sixteen_number[i]<='F')
{
sum = sum + sixteen_number[i] - 'A' + 10;
}
else {
sum = sum + sixteen_number[i] - '0';
}
}
cout << sum << endl;
}
return 0;
}
牛客 KY2 成绩排序
这道题是一道比较难的题,用了在黑马教程里刚学到的比较大小定义方法,在这道题中,我使用了map容器,用成绩作为key值,但是map不允许同样的key值出现,所以我将map修改为multimap. 这段代码可以多看看!!
#include<iostream>
#include<map>
using namespace std;
//升序方法
class mycompare0 {
public:
bool operator()(int v1, int v2)const
{
return v1 > v2;
}
};
//降序方法
class mycompare1 {
public:
bool operator()(int v1, int v2) const
{
return v1 < v2;
}
};
int main() {
int n;
int compare = 0;
string name;
int score;
int count = 0;
while (cin >> n >> compare)
{
if (compare == 0)
{
multimap<int, string, mycompare0> student;
for (int i = 0; i < n; i++) {
cin >> name >> score;
student.insert(make_pair(score, name));
count++;
}
for (auto it = student.begin(); it != student.end(); it++) {
cout << it->second << " " << it->first << endl;
}
}
else
{
multimap<int, string, mycompare1> student;
for (int i = 0; i < n; i++) {
cin >> name >> score;
student.insert(make_pair(score, name));
count++;
}
for (auto it = student.begin(); it != student.end(); it++) {
cout << it->second << " " << it->first << endl;
}
}
}
return 0;
}
牛客 环形链表约瑟夫问题
这道题是一道比较难的题,用了list容器
#include<iostream>
#include<list>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int ans = 0;
list<int> list01;
//往链表里放入从1到n个数据
for (int i = 1; i <= n; i++)
list01.push_back(i);
auto it = list01.begin();
while (n > 1) {
//找到第m个人
for (int i = 1; i < m; i++) {
it++;
if (it == list01.end()) {
it = list01.begin();
}
}
//删除这个人
it = list01.erase(it);
//删除这个人后如果it指向了end(),将其重置为begin()
if (it == list01.end()) {
it = list01.begin();
}
n--;
}
if (list01.empty()) {
ans = 0;
}
else {
ans = list01.front();
}
cout << ans << endl;
return 0;
}
PAT 1001 害死人不偿命的(3n+1)猜想
#include<iostream>
using namespace std;
int main() {
int num;
cin >> num;
int count = 0;
while (num != 1) {
if (num % 2 == 0) {
num = num / 2;
count++;
}
else {
num = (num * 3 + 1) / 2;
count++;
}
}
cout << count;
return 0;
}
PAT 1002 写出这个数
#include<iostream>
using namespace std;
#include<map>
#include<string>
int main() {
string s;
//输入字符串
getline(cin, s);
int sum = 0;
//遍历字符串 算出sum的值
for (int i = 0; i < s.length(); i++)
{
//小技巧:在计算char类型的数字的时候用以下方式进行转换
sum = sum + int(s[i] - '0');
}
//将sum转换为字符串
string num_string = to_string(sum);
//定义数字和拼音的映射
map<char, string> pinyin;
pinyin['0'] = "ling";
pinyin['1'] = "yi";
pinyin['2'] = "er";
pinyin['3'] = "san";
pinyin['4'] = "si";
pinyin['5'] = "wu";
pinyin['6'] = "liu";
pinyin['7'] = "qi";
pinyin['8'] = "ba";
pinyin['9'] = "jiu";
//遍历sum字符串
for (int i = 0; i < num_string.length() - 1; i++)
{
cout << pinyin[num_string[i]] << " ";
}
//输出最后一个拼音数字
cout << pinyin[num_string[num_string.length() - 1]];
return 0;
}