補了一些程式碼的註解1.我列出從第三層開始找出規律,每組球球落點為(4,6,5,7)的倍數2.舉例 Level 3 共有4個leaf,球球出現順序為(4,6,9,7)做循環*2的0次方Level 4 共有8個leaf,球球出現順序為(8,12,10,14,9,13,11,15)做循環,即為(4,6,9,7)做循環*2的1次方+(4,6,9,7)做循環*2的1次方+1Level 5 共有16個leaf,即為(4,6,9,7)做循環*2的2次方+(4,6,9,7)做循環*2的2次方+1+(4,6,9,7)做循環*2的2次方+2+(4,6,9,7)做循環*2的2次方+33.遇到的bug第五組測資結果有問題QQ#include<stdio.h>#include<math.h>int main(){int level,i,noNum,total;//total代表讀入的組數;level代表樹的高度;noNum代表落入的第幾顆球scanf("%d",&total);scanf("%d%d",&level,&noNum);for(i=1;i<=total;i++){//用一個迴圈控制有幾組測資int ans=0,n=0,start=0,leaf=0;//ans代表第noNum顆球落在哪個位子;start代表leaf號碼是4,6,5,7的規律中的倍數;leaf代表該compelet tree有多少leaf;n代表當noNum輸入後重複幾次後會落在第幾組的4,6,5,7,if(level==2){//當level樹高為2時候直接判做作印出if(noNum%2==0){printf("3\n");}else if(noNum%2==1){printf("2\n");}}else{//當level樹高是3以上start=pow(2,level-3);//start用來計算規律的倍數,例如level4 的leaf起始號碼為8(4*2的1倍);level 5 的leaf起始號碼為16(4*2的2倍)leaf=pow(2,level-1);//求出該compelet tree有多少leafn=(noNum%leaf)%4;//如果是第一組餘數為0如果是第一組餘數為0;switch(n){case 1:{ans=4*start+((noNum%leaf)/4);printf("%d\n",ans);}case 2:{ans=6*start+((noNum%leaf)/4);printf("%d\n",ans);}case 3:{ans=5*start+((noNum%leaf)/4);printf("%d\n",ans);}case 0:{ans=7*start+((noNum%leaf)/4);printf("%d\n",ans);}default:break;}}scanf("%d%d",&level,&noNum);}return 0;}
Debug::::
此規律在level5之後的餘數相加並非由0~3而是0,2,1,3。故此種寫法從level5開始會錯誤
::::感謝站內大神提供AC code