[题目描述]
?[Code: 基本上是暴力解法+部分优化细节]
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Solution
{
public:
bool match(int n) { //平衡数匹配
//int to string
/*ostringstream oss;
oss << n;
string s = oss.str();*/
string s = to_string(n); //c++11
int len = s.size(), mid = len / 2;
bool isEven = (len % 2 == 0);
int frontNum = 0, tailNum = 0;
for(int i = 0; i < len; i++) {
if(i < mid) frontNum += s[i] - '0';
//Even: mid ~ len-1, Odd: mid+1 ~ len-1
else if( (isEven && i == mid) || i > mid ) tailNum += s[i] - '0';
}
return frontNum == tailNum;
}
int balanceNum(int n) {
int sum = 0;
if(n <= 10) { return 0; }
if(n > 10) {
int newNum = n;
if(n >= 100) newNum = 99;
int count = newNum / 10;
for(int i = 1, j = 1; i <= count; i++, j++) {
sum += i*10 + j;
cout << i * 10 + j << ", ";
}
}
if( n >= 100 ) {
int count = 0;
for(int i = 101; i <= n; i++) {
if( match(i) ) {
count++;
cout << i << ", ";
if(count % 10 == 0) {
cout << endl;
}
sum += i;
}
}
}
return sum;
}
};
int main()
{
Solution s;
int sum = s.balanceNum(10001);
cout << "result = " << sum << endl;
return 0;
}
[程序结果]
?[注解]
1. 引入字符串的目的:若直接处理数字n的各个位数,则还须要加入while循环不断地对10相除以及取余,个人觉得这种方式有些繁琐。况且在一些程序竞赛中,也是建议处理较大的数字数据时,将其转换为字符串来处理。
2. match函数中关于int to string的逻辑:若使用是时低于C++11标准的编译器,则需使用sstream头文件中的ostringstream对象及其相关方法。当然,闲麻烦的话直接用string头文件中的to_string(int x)方法即可,真香!
|