有什么方法能高效的求出一個多元一次方程的所有解?
例如 X1+X2+......+X26=51;
的所有整數解,要求每個解的范圍在0-10之間。
uj5u.com熱心網友回復:
51個1,分成26堆。uj5u.com熱心網友回復:
如果允許小數或著負數的話,應該無窮多的解,只允許正整數,直接用回溯法uj5u.com熱心網友回復:
允許整數 也就是0-10,包括0,10,。我嘗試了一下,貌似會有上億的解,計算起來很慢,所以問問大神有沒有什么好辦法。
uj5u.com熱心網友回復:
沒有辦法,這個屬于“堆壘數論”--------華羅庚老先生的研究的東西。俺們只有回溯迭代一條,求個解很容易,要全部遍歷一到,可以啊。丟給位元幣,讓他發成挖礦任務,全挖礦機去算去
uj5u.com熱心網友回復:
單說求解可以說相當容易10+10+10+10+10+1
先丟5個10,相當把一個跟直線,用5點分割成6份
現在就是把剩下21點,隨機拋到那個5和10的區域里去
當然其實問題就簡化成了10 這個數 被可以被劃分成多少組
最后歸還成1+1-----------------------這就是華羅庚老先生的研究范圍了
uj5u.com熱心網友回復:
這個題目沒看懂,固定X1加到X26么?那不可能是整數,從1加到10就已經55了.uj5u.com熱心網友回復:
不是固定的可以是10+10+10+10+1+0.....+0=51。
可以是0。
uj5u.com熱心網友回復:
嗯 其實為了解決一個業務問題,想到的一種方法,不過貌似不可行。看看有沒有其他方法來解決。
uj5u.com熱心網友回復:
另x為0-10之間的一個數 隨機組合uj5u.com熱心網友回復:
X1+X2+......+Xn=MXn的取值[0,M]的整數,
定義陣列X[n-1]存臨時X的值,
定義一個迭代函式,引數包括:
n——幾元,
M——還剩下可以用來分的整數。
函式提前回傳的條件:
M=0,此時余下的X都是0,
或n=1,此時Xn=M。
M=51,n=26應該不用多久就可以全迭代出來。
uj5u.com熱心網友回復:
求所有正整數解可以,只能用列舉,26個未知數每個未知數取值范圍(0-51)嵌套26個回圈,每個回圈回圈次數51次,總次數51的26次方,列舉結果小于這個數uj5u.com熱心網友回復:
范圍是0~1,0可以的
uj5u.com熱心網友回復:
借樓提問:一元n次方程,(樓主的是n=26),如果事先不知道n的數值,n為變數。那么怎么寫這個回圈呢uj5u.com熱心網友回復:
借樓請問大佬:一元n次方程,(樓主的是n=26),如果事先不知道n的數值,n為變數。
意味著需要n個回圈,那么怎么寫代碼呢
uj5u.com熱心網友回復:
借樓請問大佬:一元n次方程,(樓主的是n=26),如果事先不知道n的數值,n為變數。
意味著需要n個回圈,那么怎么寫代碼呢
uj5u.com熱心網友回復:
那就用遞回,n次遞回
uj5u.com熱心網友回復:
如果是整數的話等于是把所有的 值窮舉一下。例如 56 個 1
然后每個值 0-10 然后多余的位數補0 .
uj5u.com熱心網友回復:
謝謝回復~~之前也想過也只有遞回的辦法了,可是這個用遞回可能難以實作吧,感覺遞回也就實作A!這種問題。例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然數解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));
這個用遞回就很難寫吧,懇求大神指點
uj5u.com熱心網友回復:
求所有正整數解可以,只能用列舉,26個未知數每個未知數取值范圍(0-51)嵌套26個回圈,每個回圈回圈次數51次,總次數51的26次方,列舉結果小于這個數
借樓請問大佬:一元n次方程,(樓主的是n=26),如果事先不知道n的數值,n為變數。
意味著需要n個回圈,那么怎么寫代碼呢
那就用遞回,n次遞回
謝謝回復~~之前也想過也只有遞回的辦法了,可是這個用遞回可能難以實作吧,感覺遞回也就實作A!這種問題。
例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然數解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));
這個用遞回就很難寫吧,懇求大神指點
uj5u.com熱心網友回復:
List<string> sl = new List<string>();
/// <summary>
/// 多元一次方程
/// </summary>
/// <param name="n">元數(多少個未知數)</param>
/// <param name="y">方程式的值</param>
/// <param name="cn">當前第幾元(未知數)取值</param>
/// <param name="cy">當前取值后的值</param>
/// <param name="slist">取值數列</param>
/// <returns></returns>
public void GetY(int n,int y,int cn,int cy,string slist)
{
string s;
int i, j, k;
s = slist;
for(i=0;i<y;i++)
{
k = cy + i;
s = s + i.ToString() + " ";
if(k<y && cn<n)
{
GetY(n, y, cn + 1, k, s);
}
if(cn==n && k==y)
{
sl.Add(s);
}
}
}
uj5u.com熱心網友回復:
51個1,分成26堆。
正解,然后用閘板法,兩個板距離不超過10
uj5u.com熱心網友回復:
51個1,分成26堆。
正解,然后用閘板法,兩個板距離不超過10
怎么解?,你寫一個出來
uj5u.com熱心網友回復:
有什么方法能高效的求出一個多元一次方程的所有解?
例如 X1+X2+......+X26=51;
的所有整數解,要求每個解的范圍在0-10之間。
1?10這個要點邏輯
uj5u.com熱心網友回復:
回圈唄,這還不簡單,倒是你這題目無解啊uj5u.com熱心網友回復:
大家討論的很好,再進一步就解決了:10+10+10+10+10+1; 這個算式很重要,之后討論的是10+10+10+10+9+2; 然后是10+10+10+10+9+1+1; 10+10+10+10+8+3; 10+10+10+10+8+2+1; ...uj5u.com熱心網友回復:
要求出所有解的話直接搜索。如果只用求出解的個數的話使用動態規劃。
uj5u.com熱心網友回復:
謝謝回復~~之前也想過也只有遞回的辦法了,可是這個用遞回可能難以實作吧,感覺遞回也就實作A!這種問題。
例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然數解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));
這個用遞回就很難寫吧,懇求大神指點
你確定你的方程有解嗎?我寫出來測驗沒解,而且x前面的系數1 2 3 5沒有規律,我也是小白,有大佬寫出來的話可以順便復制粘貼回復我一下
uj5u.com熱心網友回復:
求所有正整數解可以,只能用列舉,26個未知數每個未知數取值范圍(0-51)嵌套26個回圈,每個回圈回圈次數51次,總次數51的26次方,列舉結果小于這個數
借樓請問大佬:一元n次方程,(樓主的是n=26),如果事先不知道n的數值,n為變數。
意味著需要n個回圈,那么怎么寫代碼呢
那就用遞回,n次遞回
謝謝回復~~之前也想過也只有遞回的辦法了,可是這個用遞回可能難以實作吧,感覺遞回也就實作A!這種問題。
例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然數解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));
這個用遞回就很難寫吧,懇求大神指點
def equation(x):
if x==0:
print(pow(x,1),'+2*',pow(x,2),'+3*',pow(x,3),'+5*',pow(x,4),'!=6')
return
elif (pow(x,1)+2*pow(x,2)+3*pow(x,3)+5*pow(x,4))==6:
print(pow(x,1),'+2*',pow(x,2),'+3*',pow(x,3),'+5*',pow(x,4),'=6')
else:
print(pow(x,1),'+2*',pow(x,2),'+3*',pow(x,3),'+5*',pow(x,4),'!=6')
equation((x-1))
i=6
equation(int(i))
"""
輸出結果:
6 +2* 36 +3* 216 +5* 1296 !=6
5 +2* 25 +3* 125 +5* 625 !=6
4 +2* 16 +3* 64 +5* 256 !=6
3 +2* 9 +3* 27 +5* 81 !=6
2 +2* 4 +3* 8 +5* 16 !=6
1 +2* 1 +3* 1 +5* 1 !=6
0 +2* 0 +3* 0 +5* 0 !=6
"""
uj5u.com熱心網友回復:
這個題目沒看懂,固定X1加到X26么?那不可能是整數,從1加到10就已經55了.
不是固定的可以是10+10+10+10+1+0.....+0=51。
可以是0。
那你這個是n元n次方程了呀
uj5u.com熱心網友回復:
先說明,這段程式是用列舉的方式求解,所以非常耗時!internal class Cacu
{
//a1X1+a2X2+......+anXn=M;
//a1到an為各元系數
/// <summary>
/// 方程的解的串列
/// </summary>
/// <param name="iRatios">各元系數an</param>
/// <param name="iM">總和</param>
/// <param name="iXLower">各元的下限</param>
/// <param name="iXUpper">各元的上限</param>
internal System.Collections.Generic.List<int[]> CacuIt(int[] iRatios, int iM, int iXLower, int iXUpper)
{
System.Collections.Generic.List<int[]> lAnswers = new List<int[]>();
if (iXLower * iRatios.Length <= iM)//有解
{
int[] iXs = new int[iRatios.Length];
for (int I = 0; I < iXs.Length; I++) iXs[I] = iXLower;
bool blNotEnd = true;
while (blNotEnd)
{
if (GetCacuState(iRatios, iXs, iM))
{
int[] iXt = new int[iRatios.Length];
for (int I = 0; I < iXt.Length; I++) iXt[I] = iXs[I];
lAnswers.Add(iXt);
}
int iIndex = 0;
bool blOverflow = true;
while (blOverflow && iIndex < iXs.Length)
{
int iT = iXs[iIndex] + 1;
if (iT > iXUpper)
{
iXs[iIndex] = iXLower;
iIndex++;
}
else
{
iXs[iIndex] = iT;
blOverflow = false;
}
}
blNotEnd = iIndex < iXs.Length;
}
}
return lAnswers;
}
/// <summary>
/// 算下是不是解
/// </summary>
/// <param name="iRatios">系數表</param>
/// <param name="iXs">當前解</param>
/// <param name="iM">和</param>
/// <returns>計算結果</returns>
internal bool GetCacuState(int[] iRatios, int[] iXs, int iM)
{
int iSum = 0;
for (int I = 0; I < iRatios.Length; I++)
iSum += iRatios[I] * iXs[I];
//if (iSum == iM)
//{
// for (int I = 0; I < iXs.Length; I++)
// Console.Write(string.Format("{0}\t", iXs[I]));
// Console.WriteLine();
//}
return iSum == iM;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/129552.html
標籤:C#
上一篇:c#task
