题目要求 ;某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从3变到5,而跳过数字4,里程表所有位(个位、 十位、百位等)上的数字都是如此。
/思路:方法1,因为这个公里表跳过了4,所以含有4的都没有被记录,直接跳过了4,所以只要是不含有四的都是实际的公里表
方法2,我们用总的公里数 - 含有四的公里数 = 实际公里数
演示方法1/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int i,n,a,sum=0;
scanf("%d",&n);// 读取输入的里程表读数
int b=n;
for(i=0;b>0;i++)
{
a=b%10; //从个位开始取每一位的数字
b/=10;
if(a>4)
{
sum+=pow(10,i); //每当数字大于4时便会有个幂次方的差异
a--;
}
sum+=a*(pow(10,i)-pow(9,i)); //累加差值
}
printf("%d\n",n-sum);
return 0;
}
// 100 19 4 14 24 34 44 54 64 74 84 94 //100当中含有多少个需要跳过的4
// 1000 19*4+100+5*19 //同理可得1000中含有多少
// 10000 (9*19+100)*9+1000 //同理可得10000中含有多少
// n1=0*9+10^0 //10 以内跳过的数字 1
// n2=(1)*9+10^1 //100 以内跳过的数字 19
// n3=(n2)*9+10^2 //1000 以内跳过的数字 271
// n4=(n3)*9+10^3 //10000 以内跳过的数字 3439
// 举例 155=0+1+3+10+9+10=0+bool*10^0+(5-1)*1+bool*10^1+19
// bool 判断该数是否跳过
// 0+bool*10^0 判断个位跳过多少数字
// (5-1)*1+bool*10^1 判断十位跳过多少数字
// 19 判断百位跳过多少数字
演示方法2/
#include<stdio.h>
int main()
{
int n,i;
int c=0;//记录实际公里数
scanf("%d",&n);
for(i=1;i<=n;i++){
if(i%10!=4&&(i/10)%10!=4&&(i/100)%10!=4)
c++;}
printf("%d",c);
return 0;
}