• 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;
        }
    }
  • 相关阅读:
    linux命令-ps
    solr参数说明
    CAP原理和BASE思想
    java多线程文件上传服务器
    swift的简介
    浅谈对【OSI七层协议】的理解
    手写简易WEB服务器
    JVM知识整理和学习(转载并修改)
    多线程学习笔记六
    多线程学习笔记五
  • 原文地址:https://www.cnblogs.com/dlvguo/p/12696175.html
Copyright © 2020-2023  润新知