【广义找零钱问题】 贪心算法求解进制转换问题
生活随笔
收集整理的這篇文章主要介紹了
【广义找零钱问题】 贪心算法求解进制转换问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原題如下,怪我沒讀懂題意就開始寫代碼,曲解了題意,就寫出個這樣的奇葩進制來。但是運行結果與我的預期(實際上是對題的的錯誤理解)相符。
功能(與上圖無關)
實現自定義獨特進制的輸出。類似于找零錢問題,見博客:
牛客網_PAT乙級_1027在霍格沃茨找零錢(20)
又類似于時、分、秒的不斷加一秒運算
(秒60進1,分60進1,時24進1)
本算法實現的就是不同位置上不同進制的輸出。比如我定義了一種特殊的進制,這種進制的描述如下:
第0位是6進制(高位)
第1位是5進制
第2位是4進制
第3位是3進制
第4位是2進制(低位)
也就是說,在這種進制狀態下,
個位數只出現0,1
十位數只出現0,1,2
百位數只出現0,1,2,3…以此類推。
測試
測試用例1
輸入(代碼第8,9行)
string str1 = "000";string str2 = "321";輸出
第0位是4進制 第1位是3進制 第2位是2進制共能表示24個數000 001 010 011 020 021 100 101 110 111 120 121 200 201 210 211 220 221 300 301 310 311 320 321測試用例2
也可以輸入字母
*注意:這里的第一個輸入abc絕不僅是“從abc開始數數”的意思。
它與第二個輸入ccc結合,規定了最高位可以顯示的數只有a b c,第二位可以顯示的數只有a b ,最低位可以顯示的數只有 c.
輸入
string str1 = "abc";string str2 = "ccc";輸出
第0位是3進制 第1位是2進制 第2位是1進制共能表示6個數abc acc bbc bcc cbc ccc測試用例3
這個例子可以更清楚的理解本程序的功能
輸入
string str1 = "abc";string str2 = "bcd";輸出
第0位是2進制 第1位是2進制 第2位是2進制共能表示8個數abc abd acc acd bbc bbd bcc bcd代碼
#include<iostream> #include<string> #include<algorithm> using namespace std;int main() {string str1 = "00000";string str2 = "54321";int len = str1.length();int total = 1;int i;int jinzhi[100] = { 0 };//jinzhi[]存儲每一位的進制//計算每一位的進制 并計算總共能表示多少個數for (i = 0; i < len; i++){jinzhi[i] = abs(str1[i] - str2[i]) + 1;cout << "第" << i << "位" << "是" << jinzhi[i] << "進制" << endl;total *= (abs(str1[i] - str2[i]) + 1);}cout << "\n共能表示" << total << "個數\n" << endl;int count;int j;int num[100];//num按進制存儲每一位的數字(相當于找的零錢數)//count類似于時鐘 每循環一次+1s 是進制轉換的驅動for (count = 0; count < total; count++){num[len - 1] = count;//賦初值//計算每一位的偏移 類似于找零錢 并且似乎是廣義背包的貪心算法for (j = len - 1; j > 0; j--){num[j - 1] = num[j];num[j] = num[j] % jinzhi[j];num[j - 1] /= jinzhi[j];}//輸出每一位for (int k = 0; k < len; k++){//cout << num[k];cout << (char)(str1[k] + num[k]);}cout << " ";}system("pause"); }總結
以上是生活随笔為你收集整理的【广义找零钱问题】 贪心算法求解进制转换问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【排序算法】冒泡排序 选择排序 插入排序
- 下一篇: C# 类的派生 输出个人信息