實在是不會寫
uj5u.com熱心網友回復:
for (int k = 11; k < 100; k++)
{
for (int i = k + 1; i < 100; i++)
{
for (int j = k + 1; j < 100; j++)
{
if (i * j % k == 0 && i * j / k >= 111 && i * j / k < 1000)
{
printf("%dx%d=%dx%d\n", i, j, k, i*j/k);
}
}
}
}
uj5u.com熱心網友回復:
參考 1 樓 5250 的回復: for (int k = 11; k < 100; k++)
{
for (int i = k + 1; i < 100; i++)
{
for (int j = k + 1; j < 100; j++)
{
if (i * j % k == 0 && i * j / k >= 111 && i * j / k < 1000)
{
printf("%dx%d=%dx%d\n", i, j, k, i*j/k);
}
}
}
}
題目要求數字不重復,這段程式沒有判斷數字重復問題。
uj5u.com熱心網友回復:
這道題可以看做是將數字 1~9 進行一個不重復的全排列。關鍵是要盡量提高進行全排列的效率。
實在不愿意寫程式了。
uj5u.com熱心網友回復:
樓上 @tryagain2006 的主意非常高。以下是循著他的思路做下去的。
我解釋一下:
作一個 1 到 9 的全排列,這樣就保證1-9都用 且 只用一次。
把它 分成四個部分,比如:123456789,分成12, 34, 56, 789,
檢查12 * 34 和 56 * 789, 看它們是否相等就可以了。
于是,問題就轉換為 求 1 - 9 的全排列, 檢查每一個排列,找出符合要求的排列。
這個窮舉 的回圈次數 總共為: 9 ! = 362880 次,運行非常快。
全排列使用 遞回的方法,借鑒了網上現成的演算法,特此說明。
程式如下:
#include<stdio.h>
void perm(int k, int n, int a[]){
if (k == n-1){
int d1 = a[0] * 10 + a[1];
int d2 = a[2] * 10 + a[3];
int d3 = a[4] * 10 + a[5];
int d4 = a[6] * 100 + a[7] * 10 + a[8];
if (d1 * d2 == d3 * d4){
printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);
}
}
else{
for(int i = k; i < n; i++){
int temp = a[k];
a[k] = a[i];
a[i] = temp;
perm(k+1, n, a);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
int main(){
int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
perm(0, 9, arr);
return 0;
}
結果是:
46 * 79 = 23 * 158
54 * 69 = 27 * 138
54 * 93 = 27 * 186
58 * 67 = 29 * 134
58 * 69 = 23 * 174
58 * 73 = 29 * 146
58 * 96 = 32 * 174
63 * 74 = 18 * 259
64 * 79 = 32 * 158
67 * 58 = 29 * 134
69 * 54 = 27 * 138
69 * 58 = 23 * 174
73 * 58 = 29 * 146
73 * 96 = 12 * 584
74 * 63 = 18 * 259
76 * 98 = 14 * 532
79 * 46 = 23 * 158
79 * 64 = 32 * 158
93 * 54 = 27 * 186
96 * 58 = 32 * 174
96 * 73 = 12 * 584
98 * 76 = 14 * 532
uj5u.com熱心網友回復:
如果用 Python 寫的話,就下面9行就解決問題了。運行結果一樣。
真是應了那句話:
“人生苦短,我用Python”
“Life is short, you need Python!”
from itertools import permutations
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for p in permutations(a):
d1 = p[0] * 10 + p[1]
d2 = p[2] * 10 + p[3]
d3 = p[4] * 10 + p[5]
d4 = p[6] * 100 + p[7] * 10 + p[8]
if d1 * d2 == d3 * d4:
print(d1, "*", d2, "=", d3, "*", d4)
uj5u.com熱心網友回復:
參考 5 樓 rrrr336的回復: 樓上 @tryagain2006 的主意非常高。以下是循著他的思路做下去的。
我解釋一下:
作一個 1 到 9 的全排列,這樣就保證1-9都用 且 只用一次。
把它 分成四個部分,比如:123456789,分成12, 34, 56, 789,
檢查12 * 34 和 56 * 789, 看它們是否相等就可以了。
于是,問題就轉換為 求 1 - 9 的全排列, 檢查每一個排列,找出符合要求的排列。
這個窮舉 的回圈次數 總共為: 9 ! = 362880 次,運行非常快。
全排列使用 遞回的方法,借鑒了網上現成的演算法,特此說明。
程式如下:
#include<stdio.h>
void perm(int k, int n, int a[]){
if (k == n-1){
int d1 = a[0] * 10 + a[1];
int d2 = a[2] * 10 + a[3];
int d3 = a[4] * 10 + a[5];
int d4 = a[6] * 100 + a[7] * 10 + a[8];
if (d1 * d2 == d3 * d4){
printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);
}
}
else{
for(int i = k; i < n; i++){
int temp = a[k];
a[k] = a[i];
a[i] = temp;
perm(k+1, n, a);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
int main(){
int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
perm(0, 9, arr);
return 0;
}
結果是:
46 * 79 = 23 * 158
54 * 69 = 27 * 138
54 * 93 = 27 * 186
58 * 67 = 29 * 134
58 * 69 = 23 * 174
58 * 73 = 29 * 146
58 * 96 = 32 * 174
63 * 74 = 18 * 259
64 * 79 = 32 * 158
67 * 58 = 29 * 134
69 * 54 = 27 * 138
69 * 58 = 23 * 174
73 * 58 = 29 * 146
73 * 96 = 12 * 584
74 * 63 = 18 * 259
76 * 98 = 14 * 532
79 * 46 = 23 * 158
79 * 64 = 32 * 158
93 * 54 = 27 * 186
96 * 58 = 32 * 174
96 * 73 = 12 * 584
98 * 76 = 14 * 532
感謝??,我也是這樣想的,但是我不會寫,感謝大佬
uj5u.com熱心網友回復:
參考 5 樓 rrrr336 的回復: 樓上 @tryagain2006 的主意非常高。以下是循著他的思路做下去的。
我解釋一下:
作一個 1 到 9 的全排列,這樣就保證1-9都用 且 只用一次。
把它 分成四個部分,比如:123456789,分成12, 34, 56, 789,
檢查12 * 34 和 56 * 789, 看它們是否相等就可以了。
于是,問題就轉換為 求 1 - 9 的全排列, 檢查每一個排列,找出符合要求的排列。
這個窮舉 的回圈次數 總共為: 9 ! = 362880 次,運行非常快。
全排列使用 遞回的方法,借鑒了網上現成的演算法,特此說明。
程式如下:
#include<stdio.h>
void perm(int k, int n, int a[]){
if (k == n-1){
int d1 = a[0] * 10 + a[1];
int d2 = a[2] * 10 + a[3];
int d3 = a[4] * 10 + a[5];
int d4 = a[6] * 100 + a[7] * 10 + a[8];
if (d1 * d2 == d3 * d4){
printf("%2d * %2d = %2d * %3d \n", d1, d2, d3, d4);
}
}
else{
for(int i = k; i < n; i++){
int temp = a[k];
a[k] = a[i];
a[i] = temp;
perm(k+1, n, a);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
int main(){
int arr[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
perm(0, 9, arr);
return 0;
}
結果是:
46 * 79 = 23 * 158
54 * 69 = 27 * 138
54 * 93 = 27 * 186
58 * 67 = 29 * 134
58 * 69 = 23 * 174
58 * 73 = 29 * 146
58 * 96 = 32 * 174
63 * 74 = 18 * 259
64 * 79 = 32 * 158
67 * 58 = 29 * 134
69 * 54 = 27 * 138
69 * 58 = 23 * 174
73 * 58 = 29 * 146
73 * 96 = 12 * 584
74 * 63 = 18 * 259
76 * 98 = 14 * 532
79 * 46 = 23 * 158
79 * 64 = 32 * 158
93 * 54 = 27 * 186
96 * 58 = 32 * 174
96 * 73 = 12 * 584
98 * 76 = 14 * 532
其實,這道題目還有一個思路,就是借鑒8后問題的非遞回演算法,這樣程式的效率是一樣比較高的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/41239.html
標籤:C語言
上一篇:哪里出了問題代碼
下一篇:大佬們有什么思路嗎,現在老師整了這個,頭疼