回溯演算法求解橋本分數式
題目描述: 將 1-9 九個數不重複地賦給不同的 9 個元素 ,實現形如 a/bc+d/ef=f/hi 的形式: 例:1/26+5/78=4/39 1/32+5/96=7/84 (注意:1/26+5/78=4/39 和 5/78+1/26=4/39 只能算一種解) 求滿足條件的解共有多少個? 思路: 要用回溯法
可見問題的解空間是9位的整陣列,其約束條件是9位數字中沒有相同的數字且必須滿足分數式的要求。為此設定a陣列,式中每一個數用一個陣列元素表示:a[1]/a[2]a[3]+a[4]/a[5]a[6] = a[7]/a[8]a[9]。同時式中三個分母分別為:
m1 = a[2]a[3] = a[2]*10+a[3]; m2 = a[5]a[6] = a[5]*10+a[6]; m3 = a[8]a[9] = a[8]*10+a[9]
注意到等式左側兩分數交換次序只算一個解,為了避免重複,令a[1] < a[4]。
回溯程式程式碼:
#include<stdio.h>
void main()
{
int g, i, k, s, a[10];
long m1, m2, m3;
i = 1;
a[1] = 1;
s = 0;
while (1)
{
g = 1;
for (k = i - 1; k >= 1; k--)
{
if (a[i] = a[k])
{
g = 0;
break;
}
}
if (i == 9 && g == 1 && a[1] < a[4])
{
m1= a[2] * 10 + a[3];
m2 = a[5] * 10 + a[6];
m3 = a[8] * 10 + a[9];
if (a[1] * m2*m3 + a[4] * m1*m3 == a[7] * m1*m2)
{
printf("(%2d)", ++s);
printf("%d/%ld+%d/%ld = %d/%ld", a[1], m1, a[4], m2, a[7], m3);
if (s % 2 == 0) { printf("\n"); }
}
}
if (i < 9 && g == 1)
{ i++; a[i] = 1; continue; }
while (a[i] == 9 && i > 1)
{
i--; }
if (a[i] == 9 && i == 1)
{
break;
}
else
{
a[i]++;
}
}
printf("共有以上%d個解。\n", s);
}
相關文章
- 求自然數的組合數的回溯演算法演算法
- 質數填表問題的回溯演算法演算法
- 回溯演算法演算法
- 【演算法詳解】求解數值的整數次方演算法
- 演算法-回溯演算法演算法
- [演算法之回溯演算法]演算法
- 分散式方案求解.分散式
- [藍橋杯][演算法提高VIP]尤拉函式演算法函式
- 演算法訓練 字首表示式 (藍橋杯)演算法
- 常用演算法之回溯法演算法
- [藍橋杯][演算法提高VIP]大數加法演算法
- 藍橋杯 (java)演算法訓練 數對Java演算法
- C++搜尋與回溯演算法之Lake Counting(數湖)C++演算法
- 求教 | PHP,最小二乘法多項式求解,演算法!PHP演算法
- [藍橋杯][演算法訓練VIP]方格取數演算法
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法
- 經典演算法之回溯法演算法
- 刷題總結——回溯演算法演算法
- 回溯演算法介紹以及模板演算法
- 演算法問題基於蟻群演算法求解求解TSP問題(JAVA)演算法Java
- 回溯演算法之復原IP地址演算法
- ”回溯演算法“框架及練習題演算法框架
- Day 22 回溯演算法 part01演算法
- Day25 第七章 回溯演算法part04 回溯終章演算法
- 【LeetCode回溯演算法#08】遞增子序列,鞏固回溯演算法中的去重問題LeetCode演算法
- 五大常用演算法之四:回溯演算法演算法
- Java實現 藍橋杯 演算法提高 八數碼(BFS)Java演算法
- 藍橋杯 演算法訓練 K好數(Java解題)演算法Java
- 從八皇后問題到回溯演算法演算法
- 程式碼隨想錄演算法-回溯4演算法
- 程式碼隨想錄演算法 - 回溯3演算法
- 03 迴歸演算法 - 線性迴歸求解 θ(最小二乘求解)演算法
- 同樣演算法的Python和C求解數獨程式速度比較演算法Python
- [Java] 藍橋杯ALGO-117 演算法訓練 友好數JavaGo演算法
- 【演算法框架套路】回溯演算法(暴力窮舉的藝術)演算法框架
- LeetCode演算法訓練-回溯總結LeetCode演算法
- 五大常用演算法之四:回溯法演算法
- 【經典演算法問題】馬的遍歷【回溯】演算法