问题:
题目描述
某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从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;
好啦,希望能够帮助到大家!