hdu4814 模拟(黄金分割进制转换)
生活随笔
收集整理的這篇文章主要介紹了
hdu4814 模拟(黄金分割进制转换)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 給你一個(gè)十進(jìn)制數(shù),讓你把他轉(zhuǎn)化成Q進(jìn)制數(shù),Q是黃金分割比 = (1+√5)/2.
思路:
? ? ? ?首先要明確的就是雖然q是實(shí)數(shù),但是依然可以轉(zhuǎn)換成q進(jìn)制數(shù),因?yàn)槿魏螖?shù)num,都有 num = num * 1 => num = num * q^0,先把所有的數(shù)字都放在各位,然后在根據(jù)題目的要求吧他轉(zhuǎn)化成所有的數(shù)字都是0或者1,不能有兩個(gè)連續(xù)的1,首先題目給了我們兩個(gè)式子,經(jīng)過簡單轉(zhuǎn)化就能得到這兩個(gè)式子
Q^n = Q^(n-1) + Q^(n-2)
2*Q^n = Q^(n+1) + Q^(n-2)
這樣對(duì)于全都轉(zhuǎn)換成0,1,我們可以先把所有的數(shù)字num都放在個(gè)位,然后在根據(jù)
2*Q^n = Q^(n+1) + Q^(n-2)把大于1的數(shù)字分解,一直分解到所有數(shù)字小于等于1
? ? ? 給你一個(gè)十進(jìn)制數(shù),讓你把他轉(zhuǎn)化成Q進(jìn)制數(shù),Q是黃金分割比 = (1+√5)/2.
思路:
? ? ? ?首先要明確的就是雖然q是實(shí)數(shù),但是依然可以轉(zhuǎn)換成q進(jìn)制數(shù),因?yàn)槿魏螖?shù)num,都有 num = num * 1 => num = num * q^0,先把所有的數(shù)字都放在各位,然后在根據(jù)題目的要求吧他轉(zhuǎn)化成所有的數(shù)字都是0或者1,不能有兩個(gè)連續(xù)的1,首先題目給了我們兩個(gè)式子,經(jīng)過簡單轉(zhuǎn)化就能得到這兩個(gè)式子
Q^n = Q^(n-1) + Q^(n-2)
2*Q^n = Q^(n+1) + Q^(n-2)
這樣對(duì)于全都轉(zhuǎn)換成0,1,我們可以先把所有的數(shù)字num都放在個(gè)位,然后在根據(jù)
2*Q^n = Q^(n+1) + Q^(n-2)把大于1的數(shù)字分解,一直分解到所有數(shù)字小于等于1
對(duì)于連續(xù)的11我們可以Q^n = Q^(n-1) + Q^(n-2)分解連續(xù)的1,有一點(diǎn)要注意的就是這兩個(gè)處理要同時(shí)做,因?yàn)榉纸?1可能會(huì)產(chǎn)生大于1的數(shù)字,所以兩個(gè)一起弄(一起的意思就是while(!ok){處理問題1;處理問題2;}),直到所有的都滿足條件就行了。
#include<stdio.h> #include<string.h> int main () {int ans[105] ,i ,j;int n;while(~scanf("%d" ,&n)){memset(ans ,0 ,sizeof(ans));ans[50] = n;int mk = 1;while(mk){mk = 0;for(i = 2 ;i <= 100 ;i ++){if(ans[i] > 1){ans[i+1] += ans[i] / 2;ans[i-2] += ans[i] / 2;ans[i] %= 2;mk = 1;}}for(i = 1 ;i <= 100 ;i ++)if(ans[i] && ans[i+1]){int tmp = ans[i] < ans[i+1] ? ans[i] : ans[i+1];ans[i] -= tmp;ans[i+1] -= tmp;ans[i+2] += tmp;}}int st ,et;for(i = 100 ;i >= 1 ;i --)if(ans[i]) {st = i;break;}for(i = 1 ;i <= 100 ;i ++)if(ans[i]) {et = i ;break;}for(i = st ;i >= et ;i --){if(i == 49)printf(".");printf("%d" ,ans[i]);}puts("");}return 0; }
總結(jié)
以上是生活随笔為你收集整理的hdu4814 模拟(黄金分割进制转换)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4771 水搜索(状态压缩+bfs
- 下一篇: hdu4807枚举费用流