- 旋转数字
我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。
如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。
现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?
class Solution {
public:
int total_good_number = 0; //总个数
int rotatedDigits(int n) {
for (int i = 1; i <= n; i ++) {
if (is_roating_number(i)) total_good_number ++;
}
return total_good_number;
}
int get_rotation(int x) /获取0-9旋转后的数字
{
int res = 0;
if (x == 0) res = 0;
else if (x == 1) res = 1;
else if (x == 2) res = 5;
else if (x == 5) res = 2;
else if (x == 6) res = 9;
else if (x == 8) res = 8;
else if (x == 9) res = 6;
return res;
}
bool is_roating_number(int x) //判断每个数是否符合旋转定义
{
int target_X = 0; //旋转后的数字
int re_x = x; //记录旋转前的数字
int mul = 1; //用于计算旋转后的数字每次*10
while (x) {
int bit = x % 10; //从每个数的低位开始判断
if (bit == 3 || bit == 4 || bit == 7) { //如果含有这些数字显然不是旋转数字
return false;
}
x /= 10; //减少位数
bit = get_rotation(bit); //有可能成为旋转数字的位
target_X = target_X + bit * mul; //计算旋转后的数字
mul *= 10; //
}
if (target_X == re_x) return false; //判断旋转后的数字是否与旋转前的相同
return true;
}
};