进制转换相关题——禁止用7(同理,禁止其他数也是一样的)

/*
  禁止用7:求从1-n中有多少个能用的数字。
这个十进制数位拆解,他实际对应的是九进制的数,每个数的权值是9。
但是特殊的地方是n中存有7的时候,以它为首的所有数值都不允许使用。
 */
#include <iostream>
using namespace std;
int main() {
	int T;
	cin >> T;
	while (T--) {
		long long x;
		cin >> x;
		long long ans = 0, rp = 1;//rp权重,因为7要被割舍,所以每一个位置上的权重只有9
		if(x%10!=7){
			ans++;//个位从0开始
		}
		while (x > 0) {
			int t = x % 10;//数是十进制的,每一位拆出来的是个九进制。
			if(t==7) ans = 0;//排除掉前面的所有内容,因为该位为7,所有其他所有位都不能计入。
			else if (t > 7) t--;//因为需要排除本位,所以是t个数,然后又涉及到了7的问题,7要跳过,那么要减一。
			ans += t * rp;//从底开始往上加。
			x /= 10;
			rp = rp * 9;//权值不断*9。
		}
		cout << ans << endl;
	}
	return 0;
}

计算n到m之间的有多少个不包含7的数

#include <iostream>
using namespace std;
/*
33-> 3*9+3
77-> 7*9 把70-》77(8个数)剔除,但因为在计算的过程中,是按照9进制方式获取的,碰到>4减一,7+1-1,所以实际是清掉了之前的记录s=7改为s=0。
712-> 7*9*9 把700->712(13个数)剔除,但因为在计算的过程中,是按照9进制方式获取的,1*9+3=12,所以实际是清掉了之前的记录s=12改为s=0。
*/
int get_count(int a){
    int c=1, s=0;
    if(a%10!=7) s=1;
    while(a){
        int b = a%10;
        if(b==7) s=0;
        else if(b>7) b--;
        s+=b*c;
        c*=9;
        a/=10;
    }
    return s;
}

int main() {
    int n, m, ans = 0;
    cin >> n >> m;
    cout << get_count(m)-get_count(n-1);
    return 0;
}
posted @ 2024-12-12 15:49  Danlis  阅读(25)  评论(0)    收藏  举报