信息学奥赛一本通 1208:2的幂次方表示 | OpenJudge 2.2 8758:2的幂次方表示 | 洛谷 P1010 [NOIP1998 普及组] 幂次方
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1208:2的幂次方表示 | OpenJudge 2.2 8758:2的幂次方表示 | 洛谷 P1010 [NOIP1998 普及组] 幂次方
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【題目鏈接】
ybt 1208:2的冪次方表示
OpenJudge 2.2 8758:2的冪次方表示
洛谷 P1010 [NOIP1998 普及組] 冪次方
【題目考點(diǎn)】
1. 遞歸
【解題思路】
- 遞歸問題:將數(shù)字k轉(zhuǎn)為2的冪次方表示的字符串
- 遞歸關(guān)系:
二進(jìn)制按位權(quán)展開式形式如下:
k=d0?20+d1?21+...+dk?2kk = d_0*2^0+d_1*2^1+...+d_k*2^kk=d0??20+d1??21+...+dk??2k
將數(shù)字k轉(zhuǎn)為二進(jìn)制數(shù),即為在二進(jìn)制下作數(shù)字拆分,與十進(jìn)制數(shù)字拆分類似。例:下面的代碼為將數(shù)字k轉(zhuǎn)為二進(jìn)制并逆序輸出
for(int a = k; a > 0; a /= 2)cout << a%2; 拆分出的第0個(gè)數(shù)字為d0d_0d0?,位權(quán)為202^020,第1個(gè)數(shù)字為d1d_1d1?,位權(quán)為212^121…,第i個(gè)數(shù)字為did_idi?,位權(quán)為2i2^i2i。
將k在二進(jìn)制下作數(shù)字拆分,如果第i次拆分出的數(shù)字did_idi?為0,則略過。如果第i次拆分出的數(shù)字did_idi?不為0,則看i的值。- 如果i為0,那么這一項(xiàng)為2(0)
- 如果i為1,那么這一項(xiàng)為2
- 如果i大于1,那么這一項(xiàng)為2(s),括號(hào)里的字符串s為將數(shù)字i轉(zhuǎn)為2的冪次方表示的字符串,可以通過遞歸調(diào)用本函數(shù)得到。
- 遞歸出口:
- 如果i為0或i為1的情況就是遞歸出口。
【題解代碼】
解法1:遞歸
#include<bits/stdc++.h> using namespace std; string solve(int k) {string s;for(int a = k, i = 0; a > 0; a /= 2, i++)//其中一項(xiàng)為a%2*2^i{if(a%2 == 1){if(i == 0)s = "2(0)+" + s;//逆序構(gòu)造字符串,需要將新得到的字符串接在s的前面 else if(i == 1)s = "2+" + s;elses = "2(" + solve(i) + ")+" + s; }}s.pop_back();//如果如上述方法構(gòu)造字符串,最后末尾會(huì)多一個(gè)"+",將這個(gè)"+"刪掉。return s; } int main() {int n;cin >> n;cout << solve(n);return 0; }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1208:2的幂次方表示 | OpenJudge 2.2 8758:2的幂次方表示 | 洛谷 P1010 [NOIP1998 普及组] 幂次方的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 10g rac 包root
- 下一篇: 信息学奥赛一本通 2042:【例5.10