信息学奥赛一本通 2004:【20CSPJ普及组】优秀的拆分 | 洛谷 P7071 [CSP-J2020] 优秀的拆分
【題目鏈接】
ybt 2004:【20CSPJ普及組】?jī)?yōu)秀的拆分
洛谷 P7071 [CSP-J2020] 優(yōu)秀的拆分
【題目考點(diǎn)】
- 數(shù)制
- 基數(shù):即進(jìn)制數(shù)。十進(jìn)制的基數(shù)是10,二進(jìn)制的基數(shù)是2。
- 按位權(quán)展開:
例:1234=1?103+2?102+3?101+4?1001234 = 1*10^3+2*10^2+3*10^1+4*10^01234=1?103+2?102+3?101+4?100 - 十進(jìn)制轉(zhuǎn)二進(jìn)制方法:除基取余
10 / 2 = 5 … 0
5 / 2 = 2 … 1
2 / 2 = 1 … 0
1 / 2 = 0 … 1
先得到的余數(shù)是低位,后得到的是高位。從下向上取數(shù)字,得到10對(duì)應(yīng)的的二進(jìn)制數(shù)字為1010
【解題思路】
-
題目中的拆分,即為數(shù)字在二進(jìn)制下的按位權(quán)展開式。
例:10=23+21=1?23+0?22+1?21+0?2010 = 2^3 + 2^1 = 1*2^3+0*2^2+1*2^1+0*2^010=23+21=1?23+0?22+1?21+0?20 ,提取每項(xiàng)前面的系數(shù),就可以得到10的二進(jìn)制表示為1010。 -
題目要求拆分后的各個(gè)數(shù)字必須是2的正整數(shù)次冪,也就是說202^020即111不符合要求,奇數(shù)在按位權(quán)展開后必然會(huì)得到一項(xiàng)202^020,因此奇數(shù)沒有優(yōu)秀的拆分。
-
可以通過除基取余的方法得到這個(gè)二進(jìn)制數(shù)字,將其記錄在一個(gè)數(shù)字?jǐn)?shù)組中。再?gòu)母呶幌虻臀槐闅v這個(gè)數(shù)字?jǐn)?shù)組,如果數(shù)組某元素為1,那么輸出該位置對(duì)應(yīng)的位權(quán)。
例:10通過除基取余得到的二進(jìn)制數(shù)字存在數(shù)組中,為
數(shù)組元素:0 1 0 1
數(shù)組下標(biāo):0 1 2 3
倒序遍歷數(shù)組,如果下標(biāo)為i的元素為1,那么輸出2i2^i2i -
【注意 :輸出樣式】pow函數(shù)返回浮點(diǎn)型,如數(shù)字很長(zhǎng),用cout或printf("%g")輸出時(shí),會(huì)以科學(xué)計(jì)數(shù)法的形式輸出,那樣不符合題目要求。應(yīng)該將pow()函數(shù)的返回值轉(zhuǎn)為整型后再輸出。
【題解代碼】
解法1:
#include<bits/stdc++.h> using namespace std; int main() {int n, num, r[100], ri = 0;//r:數(shù)字?jǐn)?shù)組 ri:數(shù)組填充用下標(biāo) cin >> n;if(n % 2 == 1)cout<<-1;else{for(int a = n; a > 0; a /= 2)//除基取余 r[ri++] = a % 2;for(int i = ri - 1; i >= 0; i--)//倒序遍歷數(shù)組 {if(r[i] == 1)cout << int(pow(2, i)) << ' ';//輸出2^i,要以整型輸出,pow返回浮點(diǎn)型,浮點(diǎn)型在很長(zhǎng)時(shí)輸出樣式可能變?yōu)榭茖W(xué)計(jì)數(shù)法 }}return 0; }解法2:
用num記錄當(dāng)前位權(quán),如果當(dāng)前位權(quán)系數(shù)為1,那么用數(shù)組r記錄,位權(quán),最后倒序輸出數(shù)組r。
#include<bits/stdc++.h> using namespace std; int main() {int n, a, wei, r[100], ri = 0;cin>>n;if(n % 2 == 1)cout << -1;else{//wei為位權(quán),初值1,每次循環(huán)乘2,值為1,2,4,8。。。 for(a = n, wei = 1; a > 0; a /= 2, wei *= 2){if(a % 2 == 1)//如果位權(quán)前系數(shù)為1 r[ri++] = wei;//記錄該位權(quán) }for(int i = ri - 1; i >= 0; --i)//倒序遍歷輸出 cout<<r[i]<<' ';}return 0; } 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 2004:【20CSPJ普及组】优秀的拆分 | 洛谷 P7071 [CSP-J2020] 优秀的拆分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息奥赛一本通(1839:【05NOIP
- 下一篇: 信息学奥赛一本通(1397:简单算术表达