1 条题解

  • 0
    @ 2025-4-7 20:59:25

    题意分析:

    本题给定一个有缺陷的汽车里程计的读数,里程计在显示数字时跳过数字 4,即在每个位上数字按顺序为 0, 1, 2, 3, 5, 6, 7, 8, 9。这相当于一个没有 4 的数字系统,每一位实际上是在“9 进制”的概念下变化,但数字 4 被跳过了。因此题意就是将一个“缺4进制”转换为十进制数。

    解题思路:

    1、数据预处理:

    预先计算出 9 的各个次幂(即 9^0, 9^1, …, 9^10),方便后续将各位数字乘以对应的权值。

    2、数字修正:

    对于读数中的每个数字,从个位开始处理:如果数字大于 4,则说明原本的数字在标准进制中应比当前数值小 1(因为数字 4 被跳过了),因此需要将该数字减 1 以得到正确的数值。

    3、累加计算:

    从低位到高位遍历字符串,对每一位的修正后数字乘以对应的 9 的幂次,然后累加起来,得到转换后的十进制数值,也就是汽车实际行驶的英里数。

    本题代码

    #include <cstdio>
    #include <cstring>
    
    int nine[11] = { 1 };
    int main() {
    	char s[20], ch;
    	int i, sum, j;
    	for (i = 1; i <= 10; i++)
    		nine[i] = nine[i - 1] * 9;
    	while (scanf("%s", s) && s[0] - '0') {
    		sum = j = 0;
    		for (i = strlen(s) - 1; i >= 0; i--, j++) {
    			if ((ch = s[i]) > '4')
    				ch--;
    			sum += nine[j] * (ch - '0');
    		}
    		printf("%s: %d\n", s, sum);
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1719
    时间
    1000ms
    内存
    64MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者