这篇文章的确有点标题党了,emmm,不重要,就是这部某站热播的青春校园科幻搞笑无脑番《仙王的日常生活》,让我再一次领会了,不好好学习,连追番都要落后于人。
下面请看经典场面(逆天男主要求将灵力溢出返回NULL的成绩改为175分):
两仪码,两仪,是道教文化,阴阳、男女、黑白、天地、奇偶......
两仪,是道教文化术语,在古典哲学中指的是“阴阳”,主要为黑白双色,乃大道之本。天地初开,一切皆为混沌,是为无极,无极生太极,太极生两仪,两仪为阴阳。《易经》:“易有太极,始生两仪,两仪生四象,四象生八卦。” 两仪在《易经》中指阴(- -)阳(—)。关于“两仪”之说,综合历代易学家的理论,计有八说:一说为阴阳,一说为天地,一说为奇偶,一说为刚柔,一说为玄黄,一说为乾坤,一说为春秋,一说为不变与变。但通常都是指阴阳。天地万物,世间万事,古人概之为:阴阳。阴阳也是天地出分之时,清气向上为天。浊气向下为地。天为阳,地为阴。天地万物,世间万事,古人概之为:阴阳。
那么两仪码到底该是个什么?
乾坤乾坤乾乾乾乾,乾坤,还是道教,天地、日月、阴阳、刚柔......
乾坤是一个汉语词汇,拼音是qián kūn。为道教文化术语,一指《易》的乾卦和坤卦。二指天地。三指日月。四指阴阳;刚柔。五指国家;江山;天下。六指局势,大局。七指帝、后。八指玄虚;花招。在太极八卦中以乾坤为主,乾三连,坤六断,此二卦包罗万象,乃万物之源,一般代表天地,南北,阴阳。先天八卦,是乾坤定南北,坎离定东西,是天南地北为序,上为天为乾,下为地为坤,左为东为离,右为西为坎。乾、坤是先天八卦中的两卦,乾为天,坤为地,乾坤代表天地。
那么乾坤乾坤乾乾乾乾到底该是个什么?
我去,***不就是二进制吗?(动脑子想想,这小编,怕不是道教文化毕业辅修计算机专业。两仪码,就是二进制码,乾是1坤是0,的确符合道教术语解释)。
对不起,我不配,是我拖后腿了......
进制转换,计算机最基础的知识点,早已经被各种各样的计算器和进制转换机封装,方便使用的同时,你是否真的理解并学会了进制转换?离开了计算器和进制转换机,你是否还具有看懂动漫的能力?
进入正题,常见的进制转换一般是在二进制、八进制、十进制、十六进制等的转换。求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
以二进制和十进制的相互转换为例:
在二进制转换为十进制时,需要使用到二进制的每一个字符和二进制的长度,即二进制的每一位字符乘2的(i-1)次方的和为十进制。
程序描述:
将a进制的n(n是字符数组)转换为10进制的数。
int func(int a,char n[]){
int len=strlen(n);
int i,ans=0;
for(i=0;i<len;i++){
//二进制到十进制之间使用的运算规则
if(n[i]>='0'&&n[i]<='9')
ans=ans+pow(a,len-1-i)*(n[i]-'0');
//十进制之后需要增加的运算规则
else if(n[i]>='a'&&n[i]<='z')
ans=ans+pow(a,len-1-i)*(n[i]-'a'+10);
else
ans=ans+pow(a,len-1-i)*(n[i]-'A'+10);
}
return ans;
}
在十进制转换为二进制时,需要对所求的数进行循环取余和取商的操作,直到符合要求,需要注意两点是:
1.当所求值为0时,需要特判;
2.结果需要逆序输出,如上图。
程序描述:
将10进制的ans转换为b进制的数。
void fun(int ans,int b){
char arr[100];
int i,j=0,tmp;
while(ans!=0){
tmp=ans%b;//取出余数
if(tmp>=10)//大于等于十,需要使用字母
arr[j++]=tmp-10+'A';
else//小于十,使用数字
arr[j++]=tmp+'0';
ans=ans/b;
}
//当ans为0,也即j为0,需要特判;
if(j==0)
arr[j++]='0';
//逆序输出
for(i=j-1;i>=0;i--){
printf("%c",arr[i]);
}
}
以上的两个函数结合起来,就可以在任意进制之间的转换。任何的进制都可以先转换到十进制,再由十进制转换为对应的进制(潜移默化的意识);
#include<cstdio>
#include<cstring>
#include<cmath>
const int maxn = 10010;
int func(int a,char n[]){
int len=strlen(n);
int i,ans=0;
for(i=0;i<len;i++){
//二进制到十进制之间使用的运算规则
if(n[i]>='0'&&n[i]<='9')
ans=ans+pow(a,len-1-i)*(n[i]-'0');
//十进制之后需要增加的运算规则
else if(n[i]>='a'&&n[i]<='z')
ans=ans+pow(a,len-1-i)*(n[i]-'a'+10);
else
ans=ans+pow(a,len-1-i)*(n[i]-'A'+10);
}
return ans;
}
void fun(int ans,int b){
char arr[100];
int i,j=0,tmp;
while(ans!=0){
tmp=ans%b;//取出余数
if(tmp>=10)//大于等于十,需要使用字母
arr[j++]=tmp-10+'A';
else//小于十,使用数字
arr[j++]=tmp+'0';
ans=ans/b;
}
//当ans为0,也即j为0,需要特判;
if(j==0)
arr[j++]='0';
//逆序输出
for(i=j-1;i>=0;i--){
printf("%c",arr[i]);
}
}
int main(){
int a,b,x=0;
char n[maxn];
scanf("%d%s%d",&a,n,&b);
x=func(a,n);
fun(x,b);
printf("\n");
return 0;
}
不,还没完,在c++的函数库中,还有一种更加简单的函数,可以直接使用,原谅我把这最简单的不用思考就可以解题的方法留到文末:
C++库函数(strtol()/itoa())进制转换
1.strtol()函数:
作用:将一个任意1-36进制数转化为10进制数,返回是long int型。
long int strtol(const char *str, char **endptr, int base);
把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。
函数描述:
long ret = strtol(n,&result,a);
n -- 要转换为长整数的字符串。
result -- 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。
a -- 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。
实例:
输入进制大小和该进制下的数,输出转换成功后对应的十进制数:
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn = 10010;
int main(){
int a;
char n[maxn];
char *result;
scanf("%d%s",&a,n);
long ret = strtol(n,&result,a);
printf("%ld",ret);
return 0;
}
2.itoa()函数:
作用:将一个10进制的数转化为n进制的值、其返回值为char型。(和上面的strtol效果相反)
char* itoa(int val,char* dst,int radix = 10);//定义的时候默认指定10进制
函数描述:
itoa(a,result,b);
a为要转换的数,result用来存储转换结果,b为要转变的进制数。
实例:
输入一个十进制的数和将要转变的进制,输出转换成功后对应的进制数:
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn = 10010;
int main(){
int a,b;
char result[maxn];
scanf("%d%d",&a,&b);
itoa(a,result,b);
printf("%s",result);
return 0;
}
用strtol()函数和itoa()函数也可以很好的解决任意进制之间的转换:
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn = 10010;
int main(){
int a,b;
char n[maxn];
char *result;
scanf("%d%s%d",&a,n,&b);
long ret = strtol(n,&result,a);
itoa(int(ret),n,b);
printf("%s",n);
return 0;
}
来源于:微信公众号【李歘歘】
作者:李歘歘
扫码关注,领取众多粉丝福利,阅读更多原创文章,联系作者。