【C语言算法刷题】第3题

        出租车计费表任何位置只要遇到数字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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值