這道題解法很多,是遞迴演算法的一道很典型的例題,並且用字串來解效率也還可以(我也不知道時間複雜度多少算效率高,還沒學資料結構),用棧來解效率不高記憶體還大,僅僅為了滿足本人的好奇心而已~
不過我們可以先來複習一下什麼是棧:
(以下是我對棧的理解)
棧(stack)是一種線性的表,只能在表末尾進行運算,比如push(壓入)和pop(刪除),可以把它想象成一種容器,下端封口,(比如杯子,只能在杯口操作)後放進去的東西可以先拿出來,先放進去的東西要最後才能拿出來。
我對棧的理解比較淺,但如果只是簡單的應用的話,這些也足夠了。
然後來看一下棧的用法:
#include
#include
//標頭檔案
using
namespace std;
intmain()
目前會這些也就足夠用了,是一些比較基本的用法
接下來我們來看題了
所以一種比較簡單的方法就是使用字串啦。
不過我的好奇心比較強,剛好前一段時間了解到了棧,就像現學現賣,用棧解一下這個題試試。
應該是正確的,因為我在oj上是通過了的,雖然執行時間和記憶體很感人(暴風哭泣),不過如果有有漏洞的地方還是希望大家指出來啦~
int
getanswer
(stack<
char
> n,
int a)
else
if(mid.
top(
)<9+
'0')
//當棧的top仍是個位數時把這一位進上去
//為什麼這裡是9而不是10?
//因為ans的十位上的數字一定不會超過1
//要考慮進製後超過10的情況
//這裡是為了進製,而要把棧頂的元素取出來,進製後再放回去,因為無法直接對棧頂的元素操作
else
//直接放在棧中
//這一步ans要把十位的數字丟掉
ans = ans %10;
}}mid.
push
(char
(ans +
'0'));
//記住這裡要把最後一位放在棧中
if(mid.
size()
>
1)a =
getanswer
(mid,a)
;//遞迴,如果新的棧中不止一位數字,即輸入的字串每一位數字相加的和不是個位數
//那就需要繼續計算
if(mid.
size()
==1)return mid.
top();
//直到最後的結果是個位數,這時就可以把棧中的數字返回了
return a;
}
很長的**,效率也的確不高
上面的是用字串解的,下面的是我的這種演算法
不過我的好奇心已經滿足了,這波不虧。
對了,還有輸入輸出:
int
main()
//將所輸入字串中的每個字元按順序存在棧中
printf
("%c\n"
,getanswer
(n,a));
//a是用來記錄結果的
}return0;
}
每一種創傷,都是一種成熟
6.如果你準備結婚的話,告訴你一句非常重要的哲學名言 你一定要忍耐包容對方的缺點,世界上沒有絕對幸福圓滿的婚姻,幸福只是來自於無限的容忍與互相尊重。7.我的財富並不是因為我擁有很多,而是我要求的很少。8.不是某人使我煩惱,而是我拿某人的言行來煩惱自己。9.活在別人的掌聲中,是禁不起考驗的人。10.如...
每一種創傷,都是一種成熟
1.活著一天,就是有福氣,url 就該珍惜 url 當我哭泣我沒有鞋子穿的時候,我發現有人卻沒有腳。2.寧可自己去原諒別人,莫讓別人來原諒你。3.世界原本就不是屬於你,因此你用不著拋棄,要拋棄的是一切的執著。萬物皆為我所用,但非我所屬。4.別人可以違背因果,別人可以害我們,打我們,毀謗我們。可是我們...
快樂是一種品位,一種氣質。
這兩天很不爽,2月初,應該是寒冷的,可是杭州現在最高溫度達到了24度,確切的說今天的氣溫是13 24度,大太陽。暖和了,卻惶恐了。如果沒了季節之分,冬不冬,春不春,夏不夏,秋不秋,將多麼可怕。開啟qq氣象台,發現北方很冷,就杭州一帶很古怪。突然羨慕北方的人,享受著冬天。我覺得我都該裸奔了,熱啊!去年...