题目描述
远古的Pascal人也使用阿拉伯数字来进行计数,但是他们又不喜欢使用7,因为他们认为7是一个不吉祥的数字,所以Pascal数字8其实表示的是自然数中的7,18表示的是自然数中的16。下面计算一下,在正整数n范围以内包含有多少个Pascal数字。
输入格式
第一行为正整数t,接下来t行,每行一个正整数n(≤2^32-1)。
输入的是Pascal数字
t \leq 10000t≤10000
输出格式
对于每个正整数n,输出n以内的Pascal数的个数。
输入输出样例
输入 #1复制
2 10 20
输出 #1复制
9 18
#include<stdio.h>
#include<iostream>
using namespace std;
#include<math.h>
/*思路:十进制中,1234 = 1*10^3 + 2*10^2 + 3*10^1 + 4*10^0,去掉了一个数字7,变成了9进制,模拟进制转换
注意点:因为处理的数据范围是(n≤2^32-1),所以说需要用到long long int类型来储存,为了防止出错,全部设为lld类型
*/
int main()
{long long int num, n;//定义临时变量num和总数字ncin>>n;for (int i = 0; i < n; i++)//边读取边处理{cin>>num;long long int sum = 0, count = 0,temp;//每次处理前将相关数据重新定义,赋值while(num)//当num不为0的时候进行处理{temp = num % 10;//取num的最右边位数字(第一次取的是个位)if (temp < 7)//分支判断,决定计算公式sum += temp * pow(9, count);elsesum += (temp-1) * pow(9, count);num /= 10;//最右位的数字被处理后就舍去,倒数第二右位变成最右位count++;//指数自增}cout<<sum<<endl;//输出结果}return 0;
}