前置知识
很多时候我们觉得一件事情难,其实并不是这一整件事情难,而是中间有一部分(极端情况是几乎所有)东西我们不知道,没有相关的经验,所以我们不断地学习
这道题目的前置知识是十进制转三进制怎么转换(这里的3可以换成2,3,4,5,6,7,8等等)
代码如下
#include<iostream>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
char s[32];
int i=0;
while(n)
{
s[i++]=n%3;
n/=3;
}
for(i=i-1;i>=0;i--)
printf("%d",s[i]);
return 0;
}
这样去想,前面的人思考了,研究了那么多年,我们其实需要做的(入门阶段)只是去学习,去应用,所以不要有太大的心理压力
1.输入一个十进制的数字,如果要转换成三进制,就对3取余,把这个余数存在数组里面
2.把十进制数除以3,直到原来的十进制数等于0
3.查了一下oi wiki ,确实没有什么数学证明,感性的理解就好了 进制
链接
1141
题面
题目描述
平衡三进制分别使用字符'-','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,表示样例的个数。以后每行一个非负整数x,0≤x≤2^31-1。
输出
每行输出一个样例的结果。
样例输入
8 0 1 2 14 19 27 61 37726
样例输出
0 1 1- 1--- 1-01 1000 1-1-1 1-0-1-1-1-1
代码
#include<iostream>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);//输入的十进制数字
char res[32];
int i=0;
if(n==0) printf("0");
else
{
for(;n;i++)
{
if(n%3==0)
{
res[i]='0';
n/=3;
}
else if(n%3==1)
{
res[i]='1';
n/=3;
}
else
{
res[i]='-';
n=n/3+1;
}
}
for(int j=i-1;j>=0;j--)
printf("%c",res[j]);
}
printf("\n");
}
return 0;
}
总结
1.题目有一些难度直接劝退了不太好,就是冰冻三尺非一日之寒,不要一暴十寒,要坚持
2.平衡三进制和普通的三进制的区别是没有数字2,也就是说我们要改进原来的求三进制的方法。原来应该要输出2的地方,我们把下一位加上1,当前位输出'-'即可
3.比较抽象,举一个例子
4.十进制数字 14,转换成三进制是 112,转换成平衡三进制是 1---
5.遇到一个2,就把2转换成'-',然后把左边一位加上1
参考文章
XTU,C语言,平衡三进制2