c++实现1145: 有问题的里程表(2)(升级版)

问题:

题目描述

某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表所有位(个位、 十位、百位等)上的数字都是如此。例如,如果里程表显示339,汽车走过1公里之后,该里程表显示350。

输入

输入一个整数num,表示里程表显示的数值,长度不超过9位,且一定不含整数4。

输出

输出一个整数,为该汽车实际行驶的公里数。例如,如果该里程表显示55,则实际走过的公里 数是40。

代码解决:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    string num;
    cin>>num;//输入数据
    vector<int>arr;
    //获取当前输入的这个数据里面的
    for(int i=0;i<num.size();i++)
    {
        int result=num[i]-'0';
        arr.push_back(result);
    }
    //开始算
    int sum=0;
    int nine=1;
    //①先计算个位数
    int temp=arr[arr.size()-1];
    if(temp<=3)
    {
        sum=temp;
    }
    else
    {
        sum=temp-1;
    }
    //②计算剩余的数字
    for(int i=arr.size()-2;i>=0;i--)
    {
        nine=nine*9;
        int temp2=arr[i];
        if(temp2<=3)
        {
            sum+=nine*temp2;
        }
        else
        {
            sum+=nine*(temp2-1);
        }
    }
    cout<<sum<<endl;
}

效果:

分析:

之前我用遍历的思想解决过这道题c++1067: 有问题的里程表-CSDN博客

但是遍历有个缺点,就是当我们输入的数据本身很大的时候,遍历的开销很大,会超过平台规定的时间范围内,如下:

我们现在的这个思路就是避免遍历,对每一位进行分类讨论。

(1)输入数据,保存到arr里

    string num;
    cin>>num;//输入数据
    vector<int>arr;
    //获取当前输入的这个数据里面的
    for(int i=0;i<num.size();i++)
    {
        int result=num[i]-'0';
        arr.push_back(result);
    }

(2)开始计算

①先获取个位数字

//①先计算个位数
    int temp=arr[arr.size()-1];
    if(temp<=3)
    {
        sum=temp;
    }
    else
    {
        sum=temp-1;
    }

②对剩余数字进行计算并累加sum

//②计算剩余的数字
    for(int i=arr.size()-2;i>=0;i--)
    {
        nine=nine*9;
        int temp2=arr[i];
        if(temp2<=3)
        {
            sum+=nine*temp2;
        }
        else
        {
            sum+=nine*(temp2-1);
        }
    }
    cout<<sum<<endl;

好啦,希望能够帮助到大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值