POJ 2719 Faulty Odometer

来源:互联网 发布:windows内核启动慢 编辑:程序博客网 时间:2024/06/06 09:51

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
原创粉丝点击