日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

H8:小蜜蜂

發(fā)布時間:2024/3/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 H8:小蜜蜂 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

????????正好做到這里,覺得這題有點兒意思,也復(fù)習(xí)到以前寫的一些算法題目,于是我就想把我的思路放在這,僅供參考。

????????先說兩個名詞:

????????????????第一個是斐波那契數(shù)列

????????????????第二個是字符串加法

說到這是不是有點思路了呢?

題目如下:

????????一只小蜜蜂在如下圖所示的蜂窩上爬行。它爬行時,只能從一個格爬到相鄰的大號格子中。例如,從 1 號格子可以爬到 2 號或者 3 號格子,從 2 號則可以爬到 3 號或者 4 號格子。

?

請問從一個格子 a 爬到一個格子 b 一共有多少種可行的路線。

輸入:

分別是起始點 a 和終止點 b 的編號。( a 和 b 在 1~100 之間,且 a<b 。)

輸出:

方案數(shù)量。

????????首先是斐波那契數(shù)列,不難發(fā)現(xiàn),起點與終點兩個數(shù)字輸入后,總滿足他們之間的差值正好是斐波那契數(shù)列中的某一項,這里不過多贅述,可以自己嘗試一下。

? ? ? ? 然后是字符串加法,從實例中不難發(fā)現(xiàn),當(dāng)輸入1和100的時候,位數(shù)達到了驚人的21位,而最大的long long類型也只能存儲20位數(shù)據(jù),這個時候就需要利用字符串進行所謂的加法操作。

????????這里給出主要算法,一個是斐波那契數(shù)列的遞歸,一個是字符串加法的實現(xiàn)。

? ? ? ? warning:我要開始加難度了。

一、字符串加法

? ? ? ? 說到加法,我們不妨回憶一下小時候?qū)W的豎式加法,尾數(shù)對齊,滿十進一什么的馬上就想到了吧!好了,我們要開始實現(xiàn)了:

? ? ? ? 由于是要對字符串不斷加法,我們需要返回一個字符串的指針,方便多次調(diào)用和操作。

? ? ? ? malloc:在內(nèi)存堆區(qū)開辟一段存儲空間,由于是堆區(qū),就可以在函數(shù)結(jié)束的時候不至于被系統(tǒng)刪除,具體聲明格式可以自己搜索和學(xué)習(xí),這里不多說(我說的不好,沒有其他大佬說得好)

? ? ? ? 整體算法難度不大,可以自己調(diào)試一下,摸索一下。

char* solve(char* s, char* t ) {int lens = strlen(s);int lent = strlen(t);int lenresult = (lens > lent ? lens : lent) + 2; // 這里加二,創(chuàng)建一頭一尾多兩個位置int curresult = lenresult - 1; // 一來字符結(jié)尾的\0,二來首位可能進一int temp, flag = 0;char* result = (char*)malloc(sizeof(char) * (lenresult));result[curresult] = 0; // 字符里面的0其實就是\0while(lens || lent){temp = flag; // 后一位的進一,繼承到前一位計算 // 如果沒有進一,那就是0,也是一種初始化if(lent){temp += t[--lent] - '0'; // 過渡到整數(shù)的運算 }if(lens){temp += s[--lens] - '0';}flag = temp / 10; // 逢十進一 temp %= 10; // 得到尾數(shù)存儲入字符串 result[--curresult] = temp + '0'; // 將整數(shù)返還給字符形式 ,存儲入字符串 }result[0] = flag + '0'; // 這里得到最高位的數(shù)字,用于繼承到字符串首位 return flag ? result : result + 1; // 如果最高位還進一了,那就返回字符串首地址,如果沒有,返回下一位 }

?

二、斐波那契數(shù)列

? ? ? ? 由于是字符串的加法,我們所有的加法結(jié)果都存儲在字符串里面,那好,斐波那契數(shù)列怎么讓他循環(huán)計算值。

? ? ? ? 打表?我叭叭給你兩拳

? ? ? ? 不妨考慮這樣一個點,F(n+2)=F(n+1)+F(n),如果保持前后的關(guān)系,利用一個循環(huán),問題就解決了,算法如下:

? ? ? ? 很精簡,很優(yōu)雅。

int a=1; // 第一項 int b=1; // 第二項 int c=0; // 循環(huán)項 while(n--) {c=a+b;a=b;b=c; }

到這里,字符串怎么計算,等來等去的字符串可不行。

現(xiàn)在再介紹一個函數(shù):strcpy

函數(shù)作用就是:復(fù)制字符串

將源所指向的 C 字符串復(fù)制到目標(biāo)所指向的數(shù)組中,包括終止空字符(并在該點停止)。

稍微調(diào)整一下上面循環(huán)的代碼,于是就可以得到下面這個算法

int a=0;int b=0;scanf("%d %d",&a,&b);char res[30]="1";int n=b-a-1;char arr[30]="1";char brr[30]="1";while(n--){strcpy(res,solve(arr,brr)); // solve函數(shù)返回的也是一個指針strcpy(arr,brr);strcpy(brr,res);}

?

總結(jié):

? ? ? ? 這道題的關(guān)鍵就是字符串加法這個做法,其次的斐波那契數(shù)列只是在字符串的基礎(chǔ)上增加了一些新的花樣。

總結(jié)

以上是生活随笔為你收集整理的H8:小蜜蜂的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。