出租车计费表任何位置只要遇到数字4就直接跳过,题目input给出计费表的表面计数,请返回output:实际产生的费用是多少?
- Note1:需要建立【实际费用】与【计费表显示】之间的映射关系。
- Note2:【计费表显示费用】做自变量x,【实际费用】做因变量y.构建f(x)=>y
规律:0,1,2,3;(5-1)、(6-1)、(7-1)、(8-1)、(9-1)进位
等价于:0,1,2,3,4,5,6,7,8做一个轮回,本质就是九进制。
第一步:预处理
#include<stdio.h>
//函数声明:传入一个int型数组(存的是计数表显示)(函数不可修改其值)以及它的大小,返回的是实际的计费
int getResult(const int nums[],int nums_size);
int main(){
int n;
scanf("%d",&n);//输入计费表显示的数
int nums[10];
int nums_size=0;
while(n>0){
nums[nums_size]=n%10;
n=n/10;
nums_size++;
}
int l=0;
int r=nums_size-1;
while(l<r){
int tmp=nums[l];
nums[l]=nums[r];
nums[r]=tmp;
l++;
r--;
}
//预处理好的数据传入工作函数
printf("实际的费用为:%d\n",getResult(nums,nums_size));
}
第二步:设计功能函数
int getResult(const int nums[],int nums_size){
int ans=0;//是最终返回的‘实际费用’
for(int i=0;i<nums_size;i++){
int fault=nums[i];//从最高位开始处理,fault为对应位置的“位权”
if(fault>4) fault--;
//下面是找fault应该乘9的多少次方
for(int j=nums_size-i-1;j>0;j--){
fault=fault*9;
}
ans+=fault;
}
return ans;
}
整体代码:
#include<stdio.h>
//函数声明:传入一个int型数组(存的是计数表显示)(函数不可修改其值)以及它的大小,返回的是实际的计费
int getResult(const int nums[],int nums_size);
int main(){
int n;
scanf("%d",&n);//输入计费表显示的数
int nums[10];
int nums_size=0;
while(n>0){
nums[nums_size]=n%10;
n=n/10;
nums_size++;
}
int l=0;
int r=nums_size-1;
while(l<r){
int tmp=nums[l];
nums[l]=nums[r];
nums[r]=tmp;
l++;
r--;
}
//预处理好的数据传入工作函数
printf("实际的费用为:%d\n",getResult(nums,nums_size));
}
int getResult(const int nums[],int nums_size){
int ans=0;//是最终返回的‘实际费用’
for(int i=0;i<nums_size;i++){
int fault=nums[i];//从最高位开始处理,fault为对应位置的“位权”
if(fault>4) fault--;
//下面是找fault应该乘9的多少次方
for(int j=nums_size-i-1;j>0;j--){
fault=fault*9;
}
ans+=fault;
}
return ans;
}