FZU1682 拯救数据

Problem Description 题目链接

ly的电脑硬盘最近坏了,真是郁闷呐%>_<% !由于在这硬盘里保存有许多有用的数据.所以ly想尽了各种各样的方法去取出硬盘中完好的数据。硬盘是由许多个有唯一编号的扇区组成的。在用一款软件扫描硬盘时发现只有扇区编号的数字中含有3或6的损坏.其余扇区完好无损。如扇区12456损坏,而扇区12457完好。你能编程帮助ly计算从原硬盘还能取出多少扇区的数据吗?

FZU1682 拯救数据 Input

输入数据由多组数据组成,请处理至EOF。 每行输入为一个硬盘的总扇区数N(0<N<2^64)。

FZU1682 拯救数据 Output

计算并输出能取出多少扇区的数据。

FZU1682 拯救数据 Sample Input

10 77

FZU1682 拯救数据 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;
    }
}