题目来源:http://bailian.openjudge.cn/ss2018/A
1. 本题取任意位整数每一位和判断回文数的方法值得借鉴
2. 牢记在函数里修改vector要在形参里写vector<> &
void num2digits(int num, vector<int> &digits)
A:喜欢的数
总时间限制:
1000ms
内存限制:
65536kB
描述
小k对整数有一个癖好:喜欢那些本身是回文数(即从左往右读和从右往左读相同的数),并且各位数字加起来还是回文数的数,例如12521就是小k喜欢的数(12521是回文;1+2+5+2+1=11也是回文)。给定k个正整数,判断这些正整数有多少小k喜欢的数。
输入
第一行为正整数数目k。(k<20)
接下来k行,每行一个正整数。
输出
输出这些正整数中小k喜欢的数的个数。
样例输入
2
12521
123
样例输出
1
-----------------------------------------------------
解题思路
模拟题
-----------------------------------------------------
代码
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
// 取一个未知位数的整数的每一位倒着放入数组中
void num2digits(int num, vector<int> &digits)
{
digits.clear();
int i = 0;
int divider = 1;
int a_digit = 0;
while (num >= divider)
{
a_digit = (num/divider)%10;
divider *= 10;
digits.push_back(a_digit);
cout << a_digit << " ";
}
cout << endl;
}
// 判断是否是回文数
bool huiwen(int num)
{
vector<int> digits;
num2digits(num,digits);
int i = 0;
for (i=0; i<(digits.size()/2); i++)
{
if (digits.at(i) != digits.at(digits.size()-1-i))
{
return false;
}
}
return true;
}
// 判断各位之和是否是回文数
bool sum_huiwen(int num)
{
vector<int> digits;
num2digits(num,digits);
int i = 0;
int sum = 0;
for (i=0; i<digits.size(); i++)
{
sum += digits.at(i);
}
return huiwen(sum);
}
int main()
{
#ifndef ONLINE_JUDGE
ifstream fin("ss2018A.txt");
int total = 0; // # of input
fin >> total;
int cnt = 0; // answer counter
long long num = 0; // input number
while (fin >> num)
{
if (huiwen(num) && sum_huiwen(num))
{
cnt ++;
}
}
fin.close();
cout << cnt;
#endif // ONLINE_JUDGE
return 0;
}