hdu4814 模拟(黄金分割进制转换)
生活随笔
收集整理的這篇文章主要介紹了
hdu4814 模拟(黄金分割进制转换)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一個十進制數,讓你把他轉化成Q進制數,Q是黃金分割比 = (1+√5)/2.
思路:
? ? ? ?首先要明確的就是雖然q是實數,但是依然可以轉換成q進制數,因為任何數num,都有 num = num * 1 => num = num * q^0,先把所有的數字都放在各位,然后在根據題目的要求吧他轉化成所有的數字都是0或者1,不能有兩個連續的1,首先題目給了我們兩個式子,經過簡單轉化就能得到這兩個式子
Q^n = Q^(n-1) + Q^(n-2)
2*Q^n = Q^(n+1) + Q^(n-2)
這樣對于全都轉換成0,1,我們可以先把所有的數字num都放在個位,然后在根據
2*Q^n = Q^(n+1) + Q^(n-2)把大于1的數字分解,一直分解到所有數字小于等于1
? ? ? 給你一個十進制數,讓你把他轉化成Q進制數,Q是黃金分割比 = (1+√5)/2.
思路:
? ? ? ?首先要明確的就是雖然q是實數,但是依然可以轉換成q進制數,因為任何數num,都有 num = num * 1 => num = num * q^0,先把所有的數字都放在各位,然后在根據題目的要求吧他轉化成所有的數字都是0或者1,不能有兩個連續的1,首先題目給了我們兩個式子,經過簡單轉化就能得到這兩個式子
Q^n = Q^(n-1) + Q^(n-2)
2*Q^n = Q^(n+1) + Q^(n-2)
這樣對于全都轉換成0,1,我們可以先把所有的數字num都放在個位,然后在根據
2*Q^n = Q^(n+1) + Q^(n-2)把大于1的數字分解,一直分解到所有數字小于等于1
對于連續的11我們可以Q^n = Q^(n-1) + Q^(n-2)分解連續的1,有一點要注意的就是這兩個處理要同時做,因為分解11可能會產生大于1的數字,所以兩個一起弄(一起的意思就是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; }
總結
以上是生活随笔為你收集整理的hdu4814 模拟(黄金分割进制转换)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4771 水搜索(状态压缩+bfs
- 下一篇: hdu4807枚举费用流