AcWing 338. 计数问题 (将数字转化为string)
原题链接
中等
作者:
hongrubb
,
2020-02-11 13:45:59
,
所有人可见
,
阅读 978
C++ 代码
#include <bits/stdc++.h>
using namespace std;
int a, b;
int count(int x, int z) {
// if (x == 0) return 0;
string str = to_string(x);
int len = str.size();
int ans = 0;
for (int i = 0; i < len; i++){
string before = str.substr(0,i);
string after = str.substr(i+1, len);
if(z != 0) {
ans += pow(10, after.size()) * (before.size() > 0 ? stoi(before) : 0);
if (str[i] - '0' == z) ans += (after.size() > 0 ? stoi(after) : 0) + 1;
else if (str[i] - '0' > z) ans += (pow(10, after.size()));
}
else{
if (i == 0) {ans += 0;}
else {
ans += pow(10, after.size()) * (before.size() > 0 ? stoi(before) - 1 : 0);
if (str[i] - '0' == z) ans += (after.size() > 0 ? stoi(after) : 0) + 1;
else if (str[i] - '0' > z) ans += (pow(10, after.size()));
}
}
}
return ans;
}
int main(){
while (cin >> a >> b){
if (a == 0 && b == 0) break;
for (int i = 0; i < 10; i++){
if (a > b) swap(a, b);
cout << count(b, i) - count(a-1, i) << " ";
}
cout << endl;
}
return 0;
}
/*
思路:
count(x, z)计算在1~x 中,z出现的次数 x = abcdefg
{
计算z在每个位置上出现的次数
xxxzyyy
z不为0时:{
if (xxx < abc) : pow(10, len(efg)) * (xxx)
if (xxx = abc) {
if (d < z) : 0
if (d == z) : efg + 1
if (d > z) pow(10, len(efg)
}
}
z为0时:{
消去前置0,if (xxx < abc) : pow(10, len(abc)) * (xxx - 1)
}
当z为最高位时:{
if z == 0 +0;
}
}
计算a-1 与 b 的各个数字出现数字的差值
*/