不懂进制转换,我连B站追番的权利都没有

这篇文章的确有点标题党了,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;}
 

640?wx_fmt=png

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

640?wx_fmt=png

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

来源于:微信公众号【李歘歘】

作者:李歘歘

扫码关注,领取众多粉丝福利,阅读更多原创文章,联系作者

发布了312 篇原创文章 · 获赞 570 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/qq_42410605/article/details/104190705