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;
}
}