POJ 2719 Faulty Odometer

POJ  2719 Faulty Odometer

题目链接:http://poj.org/problem?id=2719

与 第37届ACM/ICPC天津赛区网络赛1001题 相类似 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4278

题意:一个坏的里程表,计数事会跳过4,像3的是时候就直接到5,跳过4.


思路:

以259为例,将259分为2个100和5个10和9。

里程表5个10,真实的数是4个10(其中有1个是4开头的),里程表的10,真实的数是9。4*9

同理,里程表的2个100,真实的数是2*81

里程表的9。真实的数是8

答案是36+162+8=206;

通过同样的方法,拆分开,

打表打出。10,100,1000,1000...的数,(发现是9进制)。

含有大于等于4的就-1;


同样的方法去做下HDU4278的那道吧,链接在上面


打表代码:

#include<stdio.h>
int main()
{
	int i,count;
	count=0;
	for(i=1;i<=100;i++)
	{
		if(i%10==4 || (i%100)/10==4 || (i%1000)/100==4)
		{
			count++;
		}
		printf("%d : %d\n",i,i-count);
	}

return 0;
}


AC代码:

#include<stdio.h>
#include<string.h>

int main()
{
	int s[10]={0,9,81,729,6561,59049,531441,4782969,43046721,387420489};
	char num[20];
	int len,i,ans,m;
	while(scanf("%s",num)!=EOF)
	{
		if(strcmp(num,"0")==0)
			break;
		ans=m=0;
		len=strlen(num);
		for(i=0;i<len;i++)
			m=m*10+num[i]-'0';
		for(i=0;i<len-1;i++)
		{
			if(num[i]>'4')
				num[i]=num[i]-1;
			ans+=s[len-i-1]*(num[i]-'0');
		}
		if(num[i]>='4')
			num[i]--;
		ans+=(num[i]-'0');
		printf("%d: %d\n",m,ans);
	}
return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值