hdu 4278——Faulty Odometer
2015-07-24 15:07
344 查看
题意:找出小于等于一个数的所有不含3和8的数有多少个。
思路:为了方便,在求解的时候先把0带上。在输出结果的时候减一就好了。个位数不含3和8的有8个,两位数有8*8个,因为两位数中,十位可以有除了3,8以外的8个数(0,1,2,4,5,6,7,9),每个打头的都有8个,所以是8*8。以此类推。计算小于等于n的符合要求的有多少个的时候,先计算最高位小于n的最高位的有多少个,再计算最高位等于n的最高位的有多少个。
代码如下:
思路:为了方便,在求解的时候先把0带上。在输出结果的时候减一就好了。个位数不含3和8的有8个,两位数有8*8个,因为两位数中,十位可以有除了3,8以外的8个数(0,1,2,4,5,6,7,9),每个打头的都有8个,所以是8*8。以此类推。计算小于等于n的符合要求的有多少个的时候,先计算最高位小于n的最高位的有多少个,再计算最高位等于n的最高位的有多少个。
代码如下:
[code]#include <cstring> #include <stdio.h> #include <algorithm> #include <iostream> #include <cmath> #include <map> #include <string> #include <queue> #include <bitset> #include<assert.h> using namespace std; int dp[20]; int cnt[]={1,2,3,3,4,5,6,7,7,8}; int mod[]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}; int getlen(int n){ int ret=0; while(n){ ret++; n/=10; } return ret; } int solve(int n) { if(n==0)return 1; int len=getlen(n); int top=n/mod[len]; int ans=cnt[top-1]*dp[len-1]; ans+=solve(n%mod[len]); return ans; } int main() { // freopen("data.txt","r",stdin); dp[0]=1; dp[1] = 8; for(int i=2;i<=10;++i){ dp[i]=8*dp[i-1]; } int n; while(scanf("%d",&n)!=EOF&&n){ printf("%d: %d\n",n,solve(n)-1); } return 0; }
相关文章推荐
- 图像处理------高斯一阶及二阶导数计算
- 学习qt遇到不显示菜单栏
- Android—开发自学历程(1)-Activity(2)-生命周期
- 如何将相册中的动态GIF图转化成NSData类型
- nginx 高并发配置参数(转载)
- Jersery——RESTful Web Services in Java,RESTful服务,Jersey+Spring实现REST服务调用
- [leetcode] 217.Contains Duplicate
- HYAppFrame(WinForm框架源码)安装部署指南
- apache kafka中server.properties配置文件参数说明
- hdu 4647
- #pragma comment 的作用
- 正则表达式 学习笔记
- js处理小数
- Java开发中的23种设计模式详解(转)
- ZJUTOJ大数乘
- Node.js的函数返回值
- (转)bat批处理的注释语句
- winform的一些小技巧
- 教你快速设置环境变量
- 对HtmlHelper扩展一:简化“列表控件”的绑定 DropDownList, ListBox