題目描述
程序員小明打了一輛出租車去上班。出于職業敏感,他注意到這輛出租車的計費表有點問題,總是偏大。
出租車司機解釋說他不喜歡數字4,所以改裝了計費表,任何數字位置遇到數字4就直接跳過,其余功能都正常。
比如:
23再多一塊錢就變為25;
39再多一塊錢變為50;
399再多一塊錢變為500;
小明識破了司機的伎倆,準備利用自己的學識打敗司機的陰謀。
給出計費表的表面讀數,返回實際產生的費用。
輸入描述:
只有一行,數字N,表示里程表的讀數。
(1<=N<=888888888)。
輸出描述:
一個數字,表示實際產生的費用。以回車結束。
補充說明:
示例1
輸入:
5
輸出:
4
說明:
5表示計費表的表面讀數。
4表示實際產生的費用其實只有4塊錢。
示例2
輸入:
17
輸出:
15
說明:
17表示計費表的表面讀數。
15表示實際產生的費用其實只有15塊錢。
示例3
輸入:
100
輸出:
81
說明:
100表示計費表的表面讀數。
81表示實際產生的費用其實只有81塊錢。
解題思路
- 將表面讀數轉換為字符串,以便按位處理數字。
- 遍歷每一位數字,從高位到低位。
- 對于每一位數字,如果是4,則直接跳過;如果大于4,則減一。
- 計算當前位數對應的實際費用,乘以權重(9的冪次方,從高位到低位遞減),并累加到總費用中。
- 返回實際產生的費用。
這樣,通過遍歷每一位數字,對數字進行適當的處理,就可以得到實際產生的費用。
題解代碼
Python題解代碼
def calculate_actual_cost(surface_reading):actual_cost = 0surface_reading_str = str(surface_reading)for i in range(len(surface_reading_str)):digit = int(surface_reading_str[i])if digit == 4:# 跳過數字 4continueelif digit > 4:# 對大于 4 的數字減一digit -= 1# 計算當前位數對應的實際費用,并累加到總費用中actual_cost += digit * (9 ** (len(surface_reading_str) - i - 1))return actual_cost# 輸入獲取
surface_reading = int(input())# 計算實際產生的費用并輸出結果
print(calculate_actual_cost(surface_reading))
JAVA題解代碼
import java.util.Scanner;
public class ReliableCar {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String line = sc.nextLine();processReliableCar( line );}}private static void processReliableCar( String line ) {StringBuffer sb = new StringBuffer();for( int i = 0; i < line.length(); i ++ ){char curChar = line.charAt( i );if( curChar > '4' ){sb.append( (char) ( curChar - 1 ) );}else{sb.append( curChar );}}String realValueStr = sb.toString();int realValue = 0;for( int i = 0; i < realValueStr.length(); i ++ ){realValue *= 9;realValue += ( realValueStr.charAt(i) - '0') ;}System.out.println( realValue ); }}
C/C++題解代碼
#include<iostream>
using namespace std;int result(int val) {int m = val;int tmp = 0, j = 0, i = 1;while (val > 0) {if (val % 10 > 4) {tmp += ((val % 10) - 1) * j + i;}else {tmp += (val % 10) * j;}val /= 10;j = j * 9 + i;i *= 10;}return m - tmp;
}int main() {int val;cin >> val;cout << result(val) << endl;return 0;
}
JS題解代碼
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {processRobotMoveArea(line);}}();function processRobotMoveArea(line) {var realValueStr = "";for( var i = 0; i < line.length; i ++ ){var curChar = line[i];if( curChar > '4' ){realValueStr += curChar - 1;}else{realValueStr += curChar;}}var realValue = 0;for( var i = 0; i < realValueStr.length; i ++ ){realValue *= 9;realValue += ( realValueStr[i] - '0') ;}console.log(realValue);
}
代碼OJ評判結果
通過測試點
代碼講解
Python題解代碼解析:
-
函數定義:
calculate_actual_cost(surface_reading)
: 定義了一個計算實際費用的函數,接收表面讀數surface_reading
作為參數。
-
變量初始化:
actual_cost = 0
: 初始化實際費用為0。surface_reading_str = str(surface_reading)
: 將表面讀數轉換為字符串,以便按位處理數字。
-
循環遍歷每一位數字:
for i in range(len(surface_reading_str))
: 遍歷表面讀數的每一位數字,從高位到低位。digit = int(surface_reading_str[i])
: 獲取當前位的數字。
-
處理數字4的情況:
if digit == 4: continue
: 如果當前位數字是4,則直接跳過。
-
處理大于4的數字:
elif digit > 4: digit -= 1
: 如果當前位數字大于4,則減一。
-
計算實際費用:
actual_cost += digit * (9 ** (len(surface_reading_str) - i - 1))
: 計算當前位數對應的實際費用,并累加到總費用中。
-
返回結果:
return actual_cost
: 返回實際產生的費用。
-
輸入獲取和結果輸出:
surface_reading = int(input())
: 獲取輸入的表面讀數。print(calculate_actual_cost(surface_reading))
: 計算實際產生的費用并輸出結果。
JAVA題解代碼解析:
-
導入包和主函數:
import java.util.Scanner;
: 導入Scanner類。public class ReliableCar {
: 定義類名為ReliableCar。
-
主函數處理輸入:
Scanner sc = new Scanner(System.in);
: 創建Scanner對象用于接收輸入。while (sc.hasNext()) {
: 循環讀取輸入。String line = sc.nextLine();
: 讀取一行輸入。
-
處理每個字符:
for( int i = 0; i < line.length(); i ++ )
: 遍歷輸入的每個字符。char curChar = line.charAt( i );
: 獲取當前字符。if( curChar > '4' ) { sb.append( (char) ( curChar - 1 ) ); }
: 如果當前字符大于4,則將字符減一后追加到結果字符串中。else { sb.append( curChar ); }
: 否則直接追加當前字符。
-
計算實際費用:
String realValueStr = sb.toString();
: 將結果字符串轉換為字符串。int realValue = 0;
: 初始化實際費用為0。for( int i = 0; i < realValueStr.length(); i ++ )
: 遍歷每個字符。realValue *= 9; realValue += ( realValueStr.charAt(i) - '0') ;
: 計算實際費用。
-
輸出結果:
System.out.println( realValue );
: 輸出實際費用。
C/C++題解代碼解析:
-
包含頭文件和主函數:
#include<iostream>
: 包含輸入輸出流頭文件。int result(int val) {
: 定義計算實際費用的函數。
-
函數實現:
int tmp = 0, j = 0, i = 1;
: 初始化臨時變量和權重變量。while (val > 0) {
: 循環處理每個數字。if (val % 10 > 4) { tmp += ((val % 10) - 1) * j + i; }
: 如果當前數字大于4,則將數字減一后加到臨時變量中。else { tmp += (val % 10) * j; }
: 否則直接加到臨時變量中。val /= 10; j = j * 9 + i; i *= 10;
: 更新數字和權重。return m - tmp;
: 返回實際費用。
-
主函數:
int main() { int val; cin >> val; cout << result(val) << endl; return 0; }
: 讀取輸入,調用函數計算實際費用,輸出結果。
JS題解代碼解析:
-
導入readline模塊:
const rl = require("readline").createInterface({ input: process.stdin });
: 使用readline模塊創建接口。
-
異步循環處理輸入:
void async function() { while (line = await readline()) { processRobotMoveArea(line); } }();
: 異步循環讀取輸入,并調用處理函數。
-
處理每個字符:
for( var i = 0; i < line.length; i ++ )
: 遍歷輸入的每個字符。var curChar = line[i];
: 獲取當前字符。if( curChar > '4' ) { realValueStr += curChar - 1; }
: 如果當前字符大于4,則將字符減一后追加到結果字符串中。else { realValueStr += curChar; }
: 否則直接追加當前字符。
-
計算實際費用:
var realValue = 0;
: 初始化實際費用為0。for( var i = 0; i < realValueStr.length; i ++ )
: 遍歷每個字符。realValue *= 9; realValue += ( realValueStr[i] - '0') ;
: 計算實際費用。
-
輸出結果:
console.log(realValue);
: 輸出實際費用。
寄語
🚀? 朋友,希望你的華為OD機試就像是一場輕松的技術party!愿你的代碼如同暢快的音符,跳躍在鍵盤上,最后彈奏出一曲高分之歌。加油,你是技術舞臺上的巨星!通過機試,就像是風輕云淡,輕輕松松就把高分收入囊中。祝愿你的編程之旅一路順風,破風前行,每一行代碼都是成功的注腳!🌈💻