链接
1140
题面
题目描述
平衡三进制分别使用字符'-','0','1'表示-1,0,1。下表表示从0到10的十进制数对应的平衡三进制的值。
十进制 | 平衡三进制 |
0 | 0 |
1 | 1 |
2 | 1- |
3 | 10 |
4 | 11 |
5 | 1-- |
6 | 1-0 |
7 | 1-1 |
8 | 10- |
9 | 100 |
10 | 101 |
现在给你一个关于平衡三进制的串,请将其转成对应的十进制数。
输入
第一行是一个整数N,表示样例的个数。以后每行一个平衡三进制的字符串,保证其转换成的整数可以用32-bit的整数表示,且全为非负整数。
输出
每行输出一个样例的结果。
样例输入
8 0 1 1- 1--- 1-01 1000 1-1-1 1-0-1-1-1-1
样例输出
0 1 2 14 19 27 61 37726
代码
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s[32];
memset(s,0,sizeof(s));
scanf("%s",s);
int num=strlen(s);
double res=0;
for(int i=0;i<num;i++)
{
if(s[i]=='-')
s[i]=-1;
else
s[i]=s[i]-48;
res+=pow(3.0,num-i-1)*s[i];
}
printf("%.0lf\n",res);
}
return 0;
}
总结
1.心态可能是做题最重要最核心的一件事情
2.还是和之前一样,把输入的数据存到数组里面,然后普通的数字和数字字符之间的差别是48,因为'0'的ASCII码是48,进制的意思就是从一个数字最右边开始计算,比如说一个三进制数字,最右边是3^0,从右边往左边数,依次是3^0,3^1,3^2,......
3.我们把三进制转换成十进制,按照上面的规则模拟出来即可,具体模拟的过程就是
res+=pow(3.0,n-i-1)*s[i];
4.输入输出有时候也有一些麻烦,因为pow函数返回的是一个double类型的数据,所以我们把答案定义为了double 类型
double res=0;
5.输出的时候我们需要的是一个整数,所以小数点后面保留0位小数就可以
printf("%.0lf\n",res);
6.从0开始计数还是从1开始计数需要特别注意,如果从0开始计数,还需要在这里减去一个1
res+=pow(3.0,n-i-1)*s[i];
n-i-1
前面说了,从最右边往左边数,所以计数是一个问题,我们知道了总长度是n,(或者前面代码里面的num)表示出来3的次数就好了