不懂進制轉換,我連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;}

 

來源於:微信公衆號【李歘歘】

作者:李歘歘

掃碼關注,領取衆多粉絲福利,閱讀更多原創文章,聯繫作者

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章