最右演算法
① 所有進制的演算法
#include <stdio.h>void a();void b();void c();void main(){ int s; do { printf("0.退出\n1.十進制~二進制\n2.十進制~八進制\n3.十進制~十六進制\n請選擇:"); scanf("%d",&s); if(s==0) { break; } switch(s) { case 1: a();break; case 2: b();break; case 3: c();break; default:printf("輸入有誤!請輸入0~4之間的數\n");break; } }while(1);}void a(){ int num,p[100],n=0,i; printf("請輸入一個十進制整數:"); scanf("%d",&num); while(num!=0) { p[n]=num%2; num/=2; n++; } for(i=n-1;i>=0;i--) { printf("%d",p[i]); } printf("\n");}void b(){ int num,p[100],n=0,i; printf("請輸入一個十進制整數:"); scanf("%d",&num); while(num!=0) { p[n]=num%8; num/=8; n++; } for(i=n-1;i>=0;i--) { printf("%d",p[i]); } printf("\n");}void c(){ int num,p[100],n=0,i; printf("請輸入一個十進制整數:"); scanf("%d",&num); while(num!=0) { p[n]=num%16; num/=16; n++; } for(i=n-1;i>=0;i--) { if(p[i]<10) { printf("%d",p[i]); } else { switch(p[i]) { case 10: printf("A"); break; case 11: printf("B"); break; case 12: printf("C"); break; case 13: printf("D"); break; case 14: printf("E"); break; case 15: printf("F"); break; } } } printf("\n");} 答案補充 10進制數轉化成R進制數就是不斷地 取余、整除,最後把所有餘倒序排列 比如:6轉化成2進制數的步驟是,6取2的余是0,整除得3,3取2的余是1,整除得1,1取2的余是1,整除2得0,計算結束,再把所有餘倒序排列,即110。
其它進制也是同樣的道理,如果進制大於10,就要用ABCD來分別表示10進制中的(10、11、12、13、14),可以去查詢下權的概念
② 二叉樹演算法—廣度搜索演算法使用以及變形
使用迭代來實現廣度搜索
思索下面幾個演算法題:
102. 二叉樹的層序遍歷
429. N 叉樹的層序遍歷
107. 二叉樹的層序遍歷 II
101. 對稱二叉樹
廣度搜索:即在水平維度一層層的去解析二叉樹節點。即節點先進先出(隊列結構)。
最簡單的演算法如上所示。
看到這個題,就想到了廣度搜索演算法。
難點: 如何將每一層的節點均存儲到一個集合中?
開始想到的思路是: 每一層末尾節點後加一個標識位表示分層?但是這種思路是不太好的!
那如何實現分層存儲?
思路 :首先廣度搜索需要有一個大循環來遍歷樹,在大循環內部可不可以使用內層循環來遍歷層呢? 即大循環開啟的是每層的查詢,小循環開啟的是每層節點的查詢?
難點 :如何控制內循環的循環次數?
思路 :每遍歷一個節點,會將節點所以子節點存儲到隊列中。當遍歷完一次,結束內循環時,隊列裡面存儲的均是下一層的節點, 而隊列的大小就是內循環的次數。
這個題如何使用廣度搜索來實現?
說實話我是沒有思路的,可能是廣度遍歷二叉樹對我影響太深,以至於廣度搜索和核心我到現在都沒明白。
這個題的難點在於:如何比較最左和最右兩個節點是否相等。
而本題的思想是兩個節點的比較,那麼在循環開始前,將root的左右節點放入到隊列中,開啟循環後,在隊列中取出兩個節點進行比較,若兩個節點相等, 按照順序,將最左和最右兩個節點在次放入到隊列中。
每次取出來的兩個節點是有序的(最左和最右)
③ 全排列or遞歸 演算法題,求一個最優演算法
這題並不是全排列,如果全排列是O(n!*n)的復雜度,完全無法接受,正解是概率期望DP
#include<stdio.h>
doubledp[1001];
intmain()
{
dp[0]=0;//0個人當然是0
inti;
doublesum=0;//記錄前面所有dp的和
for(i=1;i<=1000;i++)
{
dp[i]=sum/i+1;
sum+=dp[i];
}
while(~scanf("%d",&i))
printf("%.2lf
",dp[i]);
}
④ 我在最右紙飛機功能被禁號了能打開嗎,
不可以的,要打開需要去找客服申訴解封。
目前,紙飛機有兩部分:基於LBS定位的在線「配對聊天」和「附近人聊天」。在線配對聊天可以根據聊天對象選擇要匹配的性別(目前只匹配性別選項);對於附近的紙飛機,用戶自己拋出一個紙飛機,附近的人根據地理位置撿起扔的紙飛機,選擇和自己開啟聊天。
值得一提的是,紙飛機的匿名聊天5分鍾「聊後即焚」,所以不必擔心自己的隱私。如果聊天愉快,雙方可以在最後一分鍾同時點亮,這樣就可以自由聊天並保存聊天記錄。頭像也是紙飛機自己製作的,不能自己上傳頭像,這樣更大程度上保護了用戶的隱私。
(4)最右演算法擴展閱讀:
對於年輕用戶來說,紙飛機為他們提供了一種認識新朋友的方式(這種形式有點類似於soul)。具體規則如下:
1、通過該演算法,隨機配對到一個臨時聊天框中,雙方除性別外的所有信息都是不可見的。(頭像是隨機出現的卡通頭像)
2、在5分鍾的聊天時間內,任何一方退出聊天都將終止。聊天結束後,可以查看對方是誰,然後單擊進入對方主頁。
3、倒數到1分鍾時,雙方可以選擇是否繼續聊天。如果雙方都確定,聊天框會保留下來,可以看到對方。否則,聊天將在時間結束時終止。
⑤ 二進制轉化為十進制的演算法
從最低位(最右)算起,位上的數字乘以本位的權重,權重就是2的第幾位的位數減一次方。
比如第2位就是2的(2-1次)方,就是2;第8位就是2的(8-1)次方是128。把所有的值加起來。
2(1-1)代表2的0次方,就是1;其他類推
比如二進制1101,換算成十進制就是:1*2(1-1)+0*2(2-1)+1*2(3-1)+1*2(4-1)=1+0+4+8=13。
(5)最右演算法擴展閱讀:
1、二進制轉換為八進制:
把二進制的數從右往左,三位一組,不夠補0
列:111=4+2+1=7
11001拆分為 001和011,001=1,011=2+1=3。
那麼11001轉換為八進制就是31。
2、二進制轉換為十六進制:
參照二進制轉八進制,但是它是從右往左,四位一組,不夠補0
列子:1101101拆分為1101、0110
分別計算兩個二進制的值,1101=8+4+0+1=13,十六進制中13為D
0110=4+2=6,那麼二進制1101101轉換為十六進制就是6D。
參考資料:網路-數制
⑥ 二進制計算方法是什麼
加法:
(1)首先是最右數碼位相加。這里加數和被加數的最後一位分別為「0」和「1」,根據加法原則可以知道,相加後為「1」。
(2)再進行倒數第二位相加。這里加數和被加數的倒數第二位都為「1」,根據加法原則可以知道,相加後為「(10)2」,此時把後面的「0」留下,而把第一位的「1」向高一位進「1」。
(3)再進行倒數第三位相加。這里加數和被加數的倒數第二位都為「0」,根據加法原則可以知道,本來結果應為「0」,但倒數第二位已向這位進「1」了,相當於要加「被加數」、「加數」和「進位」這三個數的這個數碼位,所以結果應為0 1=1。
(4)最後最高位相加。這里加數和被加數的最高位都為「1」,根據加法原則可以知道,相加後為「(10)2」。一位只能有一個數字,所以需要再向前進「1」,本身位留下「0」,這樣該位相加後就得到「0」,而新的最高位為「1。
減法:
(1)首先最後一位向倒數第二位借「1」,相當於得到了(10)2,也就是相當於十進制數中的2,用2減去1得1。
(2)再計算倒數第二位,因為該位同樣為「0」,不及減數「1」大,需要繼續向倒數第三位借「1」(同樣是借「1」當「2」),但因為它在上一步中已借給了最後一位「1」(此時是真實的「1」),則倒數第二位為1,與減數「1」相減後得到「0」。
(3)用同樣的方法倒數第三位要向它們的上一位借「1」(同樣是當「2」),但同樣已向它的下一位(倒數第二位)借給「1」(此時也是真實的「1」),所以最終得值也為「0」。
(4)被減數的倒數第四位盡管與前面的幾位一樣,也為「0」,但它所對應的減數倒數第四位卻為「0」,而不是前面幾位中對應的「1」,它向它的高位(倒數第五位)借「1」(相當於「2」)後,在借給了倒數第四位「1」(真實的「1」)後,仍有「1」余,1 –0=1,所以該位結果為「1」。
(5)被減數的倒數第五位原來為「1」,但它借給了倒數第四位,所以最後為「0」,而此時減數的倒數第五位卻為「1」,這樣被減數需要繼續向它的高位(倒數第六位)借「1」(相當於「2」),2–1=1。
(6)被減數的最後一位本來為「1」,可是借給倒數第五位後就為「0」了,而減數沒有這個位,這樣結果也就是被減數的相應位值大小,此處為「0」。
在二進制數的加、減法運算中一定要聯繫上十進制數的加、減法運算方法,其實它們的道理是一樣的,也是一一對應的。在十進制數的加法中,進「1」仍就當「1」,在二進制數中也是進「1」當「1」。在十進制數減法中我們向高位借「1」當「10」,在二進制數中就是借「1」當「2」。而被借的數仍然只是減少了「1」,這與十進制數一樣。
乘法:
把二進制數中的「0」和「1」全部當成是十進制數中的「0」和「1」即可。根據十進制數中的乘法運算知道,任何數與「0」相乘所得的積均為「0」,這一點同樣適用於二進制數的乘法運算。只有「1」與「1」相乘才等於「1」。乘法運算步驟:
(1)首先是乘數的最低位與被乘數的所有位相乘,因為乘數的最低位為「0」,根據以上原則可以得出,它與被乘數(1110)2的所有位相乘後的結果都為「0」。
(2)再是乘數的倒數第二位與被乘數的所有位相乘,因為乘數的這一位為「1」,根據以上原則可以得出,它與被乘數(1110)2的高三位相乘後的結果都為「1」,而於最低位相乘後的結果為「0」。
(3)再是乘數的倒數第三位與被乘數的所有位相乘,同樣因為乘數的這一位為「1」,處理方法與結果都與上一步的倒數第二位一樣,不再贅述。
(4)最後是乘數的最高位與被乘數的所有位相乘,因為乘數的這一位為「0」,所以與被乘數(1110)2的所有位相乘後的結果都為「0」。
(5)然後再按照前面介紹的二進制數加法原則對以上四步所得的結果按位相加(與十進制數的乘法運算方法一樣),結果得到(1110)2×(0110)2=(1010100)2。
除法:
(1)首先用「1」作為商試一下,相當於用「1」乘以除數「110」,然後把所得到的各位再與被除數的前4位「1001」相減。按照減法運算規則可以得到的余數為「011」。
(2)因為「011」與除數「110」相比,不足以被除,所以需要向低取一位,最終得到「0111」,此時的數就比除數「110」大了,可以繼續除了。同樣用「1」作為商去除,相當於用「1」去乘除數「110」,然後把所得的積與被除數中當前四位「0111」相減。根據以上介紹的減法運算規則可以得到此步的余數為「1」。
(3)因為「1」要遠比除數「110」小,被除數向前取一位後為「11」,仍不夠「110」除,所以此時需在商位置上用「0」作為商了。
(4)然後在被除數上繼續向前取一位,得到「110」。此時恰好與除數「110」完全一樣,結果當然是用「1」作為商,用它乘以除數「110」後再與被除數相減,得到的余數正好為「0」。證明這兩個數能夠整除。
這樣一來,所得的商(1101)2就是兩者相除的結果。
⑦ 計算機二進制轉化成十進制的演算法步驟是什麼
從最低位(最右)算起,位上的數字乘以本位的權重,權重就是2的第幾位的位數減一次方。
比如第2位就是2的(2-1次)方,就是2;第8位就是2的(8-1)次方是128。把所有的值加起來。
2(1-1)代表2的0次方,就是1;其他類推
比如二進制1101,換算成十進制就是:1*2(1-1)+0*2(2-1)+1*2(3-1)+1*2(4-1)=1+0+4+8=13
(7)最右演算法擴展閱讀
計數規則:
在人們使用最多的進位計數制中,表示數的符號在不同的位置上時所代表的數的值是不同的。
十進制(D(decimal))是人們日常生活中最熟悉的進位計數制。在十進制中,數用0,1,2,3,4,5,6,7,8,9這十個符號來描述。計數規則是逢十進一。
二進制(B(binary))是在計算機系統中採用的進位計數制。在二進制中,數用0和1兩個符號來描述。計數規則是逢二進一。
十六進制(H(hexadecimal))是人們在計算機指令代碼和數據的書寫中經常使用的數制。在十六進制中,數用0,1,…,9和A,B,…,F(或a,b,…,f)16個符號來描述。計數規則是逢十六進一。
⑧ 方陣格子從最左上到最右下走法有多少,怎麼解決
我數學不好,給個程序吧,而且也不知道演算法對不對,你自己檢驗吧:
#include <stdio.h>
#define COL 2
#define ROW 3
int xx[ROW+2][COL+2]={0};
int fun(int x,int y)
{
int s=0;
int i,j;
xx[x][y]=1;
if (x==ROW && y==COL){
return s+=1;
}
if (xx[x+1][y]!=1){
xx[x+1][y]=1;
s+=fun(x+1,y);
xx[x+1][y]=0;
}
if (xx[x][y+1]!=1){
xx[x][y+1]=1;
s+=fun(x,y+1);
xx[x][y+1]=0;
}
if (xx[x-1][y]!=1){
xx[x-1][y]=1;
s+=fun(x-1,y);
xx[x-1][y]=0;
}
if (xx[x][y-1]!=1){
xx[x][y-1]=1;
s+=fun(x,y-1);
xx[x][y-1]=0;
}
return s;
}
main()
{
int i,j;
for (i=0;i<ROW+2;i++){
xx[i][0]=1;
xx[i][COL+1]=1;
}
for (i=0;i<COL+2;i++){
xx[0][i]=1;
xx[ROW+1][i]=1;
}
printf("%d*%d %d\n",ROW,COL,fun(1,1));
}
TC20編譯成功,如果要改變計算的值,只要改一開始的那幾個宏定義就好了,ROW代錶行數,COL代表列數,以下是幾個結果:
1*1 1;
2*2 4;
1*2 2;
3*3 12;
2*3 4;
4*4 184;
..
..
.