进制转换相关题——禁止用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;
}
fighting