FZU1682 拯救数据
Problem Description 题目链接
ly的电脑硬盘最近坏了,真是郁闷呐%>_<% !由于在这硬盘里保存有许多有用的数据.所以ly想尽了各种各样的方法去取出硬盘中完好的数据。硬盘是由许多个有唯一编号的扇区组成的。在用一款软件扫描硬盘时发现只有扇区编号的数字中含有3或6的损坏.其余扇区完好无损。如扇区12456损坏,而扇区12457完好。你能编程帮助ly计算从原硬盘还能取出多少扇区的数据吗?
Input
输入数据由多组数据组成,请处理至EOF。 每行输入为一个硬盘的总扇区数N(0<N<2^64)。
Output
计算并输出能取出多少扇区的数据。
Sample Input
10 77
Sample Output
8 45
#include <iostream> #include <math.h> using namespace std; typedef long long LL; int main() { //打表下计算下每位数有多少个正常数字 比如10有8个 100内有64个 1000内有512个 因为2^64次方<10^20 因此计算19个即可 LL table[25] = {1, 8}; for (int i = 2; i < 20; i++) { table[i] = table[i - 1] * 8; } string str; while (cin >> str) { LL sum = 0; //从最大数计算 如22312=2*10000(8^4) +2312 for (int i = 0, len = str.size() - 1; i < str.size(); i++, len--) { int n = str[i] - ‘0‘; //获取数字 int t = n; //n不为0的情况 if (n) { //去除包含3和6的数 if (n > 6) { n -= 2; } else if (n > 3) { n -= 1; } sum += table[len] * n; //如果此时数字为6或者3的话需要跳出 如6532=6000+532 因为最大位为6 剩下的后面数字无需计算 因为多算了一个60...或者30...需要-1 if (t == 6 || t == 3) { sum--; break; } } } cout << sum << endl; } }