求高手帮解决这个有关问题,用C语言
求高手帮解决这个问题,用C语言
1,2,3,4,5,6,7,8,9共9个数组成3个分数,每个数不重复使用,且分母均为两位数分子均为一位数,两个分数相加等于第三个分数,求出所有的组合 ,这个代码怎么写??
------解决思路----------------------
用递归得到所有排列, 对每种排列判断是否满足条件。
------解决思路----------------------
//总共有11194组合
#import <Foundation/Foundation.h>
//得到分数和组成分数的3个数
typedef struct number{
float num;
int a;
int b;
int c;
}Number;
int main(int argc, const char * argv[])
{
//504,是因为C(9, 3)*6 = 504
Number numb[504] = {0};
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = a;
int e = 0;
//得到所有分数
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
if (j != i && k != i && k != j) {
//分子
float molecular = *(p + i);
//分母
int denominator = *(p + j) * 10 + *(p + k);
//将分数和构成分数的3个数存储到结构体中
numb[e].num = (molecular / denominator);
numb[e].a = *(p + i);
numb[e].b = *(p + j);
numb[e].c = *(p + k);
//计算分数的个数
e++;
}
}
}
}
//确认下组成的分数是不是504个
printf("\n%d\n", e);
Number *p1 = numb;
//计数,看有几组这样的数
int count = 0;
for (int i = 0; i < 504; i++) {
for (int j = 0; j < 504; j++) {
if (j != i) {
for (int k = 0; k < 504; k++) {
if (k != i && k !=j) {
//判断3个分数的组合是否满足题意
BOOL Y = (p1 + i)->num + (p1 + j)->num == (p1 + k)->num;
if (Y == 1) {
printf("(%f,%d,%d,%d)\n", (p1 + i)->num, (p1 + i)->a, (p1 + i)->b, (p1 + i)->c);
printf("(%f,%d,%d,%d)\n", (p1 + j)->num, (p1 + j)->a, (p1 + j)->b, (p1 + j)->c);
printf("(%f,%d,%d,%d)\n", (p1 + k)->num, (p1 + k)->a, (p1 + k)->b, (p1 + k)->c);
printf("\n");
count++;
}
}
}
}
}
}
printf("总共有%d组合\n", count);
return 0;
}
------解决思路----------------------
//共有16个组合
#import <Foundation/Foundation.h>
//得到分数和组成分数的3个数
typedef struct number{
float num;
int a;
int b;
int c;
}Number;
int main(int argc, const char * argv[])
{
//504,是因为C(9, 3)*6 = 504
Number numb[504] = {0};
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = a;
int e = 0;
//得到所有分数
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
if (j != i && k != i && k != j) {
//分子
float molecular = *(p + i);
//分母
int denominator = *(p + j) * 10 + *(p + k);
//将分数和构成分数的3个数存储到结构体中
numb[e].num = (molecular / denominator);
numb[e].a = *(p + i);
numb[e].b = *(p + j);
numb[e].c = *(p + k);
//计算分数的个数
e++;
}
}
}
}
//确认下组成的分数是不是504个
printf("\n%d\n", e);
Number *p1 = numb;
//计数,看有几组这样的数
int count = 0;
for (int i = 0; i < 504; i++) {
for (int j = 0; j < 504; j++) {
if (j != i) {
for (int k = 0; k < 504; k++) {
if (k != i && k !=j) {
//判断3个分数的组合是否满足题意
BOOL Y = (p1 + i)->num + (p1 + j)->num == (p1 + k)->num;
if (Y == 1) {
//排除符合等式,但1~9重复用得组合
BOOL Y1 = (p1 + j)->a ==(p1 + i)->a
------解决思路----------------------
(p1 + j)->b == (p1 + i)->a
------解决思路----------------------
(p1 + j)->c == (p1 + i)->a;
BOOL Y2 = (p1 + k)->a ==(p1 + i)->a
------解决思路----------------------
(p1 + k)->b == (p1 + i)->a
------解决思路----------------------
(p1 + k)->c == (p1 + i)->a;
BOOL Y3 = (p1 + j)->a ==(p1 + i)->b
------解决思路----------------------
(p1 + j)->b == (p1 + i)->b
------解决思路----------------------
(p1 + j)->c == (p1 + i)->b;
BOOL Y4 = (p1 + k)->a ==(p1 + i)->b
------解决思路----------------------
(p1 + k)->b == (p1 + i)->b
------解决思路----------------------
(p1 + k)->c == (p1 + i)->b;
BOOL Y5 = (p1 + j)->a ==(p1 + i)->c
------解决思路----------------------
(p1 + j)->b == (p1 + i)->c
------解决思路----------------------
(p1 + j)->c == (p1 + i)->c;
BOOL Y6 = (p1 + k)->a ==(p1 + i)->c
------解决思路----------------------
(p1 + k)->b == (p1 + i)->c
------解决思路----------------------
(p1 + k)->c == (p1 + i)->c;
BOOL Y7 = (p1 + j)->a ==(p1 + k)->a
------解决思路----------------------
(p1 + j)->b == (p1 + k)->a
------解决思路----------------------
(p1 + j)->c == (p1 + k)->a;
BOOL Y8 = (p1 + j)->a ==(p1 + k)->b
------解决思路----------------------
(p1 + j)->b == (p1 + k)->b
------解决思路----------------------
(p1 + j)->c == (p1 + k)->b;
BOOL Y9 = (p1 + j)->a ==(p1 + k)->c
------解决思路----------------------
(p1 + j)->b == (p1 + k)->c
------解决思路----------------------
(p1 + j)->c == (p1 + k)->c;
BOOL Y10 = Y1
------解决思路----------------------
Y2
------解决思路----------------------
Y3
------解决思路----------------------
Y4
------解决思路----------------------
Y5
------解决思路----------------------
Y6
------解决思路----------------------
Y7
------解决思路----------------------
Y8
------解决思路----------------------
Y9;
if (Y10 != 1) {
//打印符合要求的组合
printf("(%f,%d,%d,%d)\n", (p1 + i)->num, (p1 + i)->a, (p1 + i)->b, (p1 + i)->c);
printf("(%f,%d,%d,%d)\n", (p1 + j)->num, (p1 + j)->a, (p1 + j)->b, (p1 + j)->c);
printf("(%f,%d,%d,%d)\n", (p1 + k)->num, (p1 + k)->a, (p1 + k)->b, (p1 + k)->c);
printf("\n");
count++;
}
}
}
}
}
}
}
printf("总共有%d组合\n", count);
return 0;
}
------解决思路----------------------
其实就枚举一下排列
1,2,3,4,5,6,7,8,9共9个数组成3个分数,每个数不重复使用,且分母均为两位数分子均为一位数,两个分数相加等于第三个分数,求出所有的组合 ,这个代码怎么写??
------解决思路----------------------
用递归得到所有排列, 对每种排列判断是否满足条件。
#include <iostream>
#include <algorithm> //std::swap
bool judge(int(&vec)[9]){
//vec[2]/(10*vec[0] + vec[1]) + vec[5]/(10*vec[3] + vec[4]) = vec[8]/(10*vec[6] + vec[7])
int left = (10* vec[0]+vec[1])*(10*vec[3] + vec[4])*vec[8];
int right = (10*vec[6] + vec[7]) * ( vec[2]*(10*vec[3] + vec[4] )+vec[5] * (10*vec[0]+vec[1])) ;
return left == right;
}
inline void solve_aux(int(&vec)[9], int level) {
if(level < 1){
if(judge(vec)){
int i = 0;
for(; i + 1 < 9; ++i){
std::cout << vec[i] << ",";
}
std::cout << vec[i] <<std::endl;
}
}else{
for(int i = 0; i < level; ++i){
std::swap(vec[i], vec[level-1]);
solve_aux(vec,level-1);
std::swap(vec[i], vec[level-1]);
}
}
}
inline void solve(int(&vec)[9]) {
solve_aux(vec, 9);
}
int main(){
int vec[] = { 1,2,3,4,5,6,7,8,9 };
solve(vec);
return 0;
}
//vec[2]/(10*vec[0] + vec[1]) + vec[5]/(10*vec[3] + vec[4]) = vec[8]/(10*vec[6] + vec[7])
5,6,4,9,8,7,2,1,3
9,8,7,5,6,4,2,1,3
2,6,5,7,8,9,1,3,4
7,8,9,2,6,5,1,3,4
7,8,5,2,6,1,3,9,4
2,6,1,7,8,5,3,9,4
4,8,7,9,6,1,3,2,5
9,6,1,4,8,7,3,2,5
3,4,9,6,8,2,1,7,5
6,8,2,3,4,9,1,7,5
9,6,7,3,2,1,4,8,5
3,2,1,9,6,7,4,8,5
3,9,4,7,8,1,5,2,6
7,8,1,3,9,4,5,2,6
5,1,9,6,8,2,3,4,7
6,8,2,5,1,9,3,4,7
9,6,5,3,2,1,8,4,7
3,2,1,9,6,5,8,4,7
3,4,6,5,1,8,2,7,9
5,1,8,3,4,6,2,7,9
------解决思路----------------------
//总共有11194组合
#import <Foundation/Foundation.h>
//得到分数和组成分数的3个数
typedef struct number{
float num;
int a;
int b;
int c;
}Number;
int main(int argc, const char * argv[])
{
//504,是因为C(9, 3)*6 = 504
Number numb[504] = {0};
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = a;
int e = 0;
//得到所有分数
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
if (j != i && k != i && k != j) {
//分子
float molecular = *(p + i);
//分母
int denominator = *(p + j) * 10 + *(p + k);
//将分数和构成分数的3个数存储到结构体中
numb[e].num = (molecular / denominator);
numb[e].a = *(p + i);
numb[e].b = *(p + j);
numb[e].c = *(p + k);
//计算分数的个数
e++;
}
}
}
}
//确认下组成的分数是不是504个
printf("\n%d\n", e);
Number *p1 = numb;
//计数,看有几组这样的数
int count = 0;
for (int i = 0; i < 504; i++) {
for (int j = 0; j < 504; j++) {
if (j != i) {
for (int k = 0; k < 504; k++) {
if (k != i && k !=j) {
//判断3个分数的组合是否满足题意
BOOL Y = (p1 + i)->num + (p1 + j)->num == (p1 + k)->num;
if (Y == 1) {
printf("(%f,%d,%d,%d)\n", (p1 + i)->num, (p1 + i)->a, (p1 + i)->b, (p1 + i)->c);
printf("(%f,%d,%d,%d)\n", (p1 + j)->num, (p1 + j)->a, (p1 + j)->b, (p1 + j)->c);
printf("(%f,%d,%d,%d)\n", (p1 + k)->num, (p1 + k)->a, (p1 + k)->b, (p1 + k)->c);
printf("\n");
count++;
}
}
}
}
}
}
printf("总共有%d组合\n", count);
return 0;
}
------解决思路----------------------
//共有16个组合
#import <Foundation/Foundation.h>
//得到分数和组成分数的3个数
typedef struct number{
float num;
int a;
int b;
int c;
}Number;
int main(int argc, const char * argv[])
{
//504,是因为C(9, 3)*6 = 504
Number numb[504] = {0};
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = a;
int e = 0;
//得到所有分数
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
if (j != i && k != i && k != j) {
//分子
float molecular = *(p + i);
//分母
int denominator = *(p + j) * 10 + *(p + k);
//将分数和构成分数的3个数存储到结构体中
numb[e].num = (molecular / denominator);
numb[e].a = *(p + i);
numb[e].b = *(p + j);
numb[e].c = *(p + k);
//计算分数的个数
e++;
}
}
}
}
//确认下组成的分数是不是504个
printf("\n%d\n", e);
Number *p1 = numb;
//计数,看有几组这样的数
int count = 0;
for (int i = 0; i < 504; i++) {
for (int j = 0; j < 504; j++) {
if (j != i) {
for (int k = 0; k < 504; k++) {
if (k != i && k !=j) {
//判断3个分数的组合是否满足题意
BOOL Y = (p1 + i)->num + (p1 + j)->num == (p1 + k)->num;
if (Y == 1) {
//排除符合等式,但1~9重复用得组合
BOOL Y1 = (p1 + j)->a ==(p1 + i)->a
------解决思路----------------------
(p1 + j)->b == (p1 + i)->a
------解决思路----------------------
(p1 + j)->c == (p1 + i)->a;
BOOL Y2 = (p1 + k)->a ==(p1 + i)->a
------解决思路----------------------
(p1 + k)->b == (p1 + i)->a
------解决思路----------------------
(p1 + k)->c == (p1 + i)->a;
BOOL Y3 = (p1 + j)->a ==(p1 + i)->b
------解决思路----------------------
(p1 + j)->b == (p1 + i)->b
------解决思路----------------------
(p1 + j)->c == (p1 + i)->b;
BOOL Y4 = (p1 + k)->a ==(p1 + i)->b
------解决思路----------------------
(p1 + k)->b == (p1 + i)->b
------解决思路----------------------
(p1 + k)->c == (p1 + i)->b;
BOOL Y5 = (p1 + j)->a ==(p1 + i)->c
------解决思路----------------------
(p1 + j)->b == (p1 + i)->c
------解决思路----------------------
(p1 + j)->c == (p1 + i)->c;
BOOL Y6 = (p1 + k)->a ==(p1 + i)->c
------解决思路----------------------
(p1 + k)->b == (p1 + i)->c
------解决思路----------------------
(p1 + k)->c == (p1 + i)->c;
BOOL Y7 = (p1 + j)->a ==(p1 + k)->a
------解决思路----------------------
(p1 + j)->b == (p1 + k)->a
------解决思路----------------------
(p1 + j)->c == (p1 + k)->a;
BOOL Y8 = (p1 + j)->a ==(p1 + k)->b
------解决思路----------------------
(p1 + j)->b == (p1 + k)->b
------解决思路----------------------
(p1 + j)->c == (p1 + k)->b;
BOOL Y9 = (p1 + j)->a ==(p1 + k)->c
------解决思路----------------------
(p1 + j)->b == (p1 + k)->c
------解决思路----------------------
(p1 + j)->c == (p1 + k)->c;
BOOL Y10 = Y1
------解决思路----------------------
Y2
------解决思路----------------------
Y3
------解决思路----------------------
Y4
------解决思路----------------------
Y5
------解决思路----------------------
Y6
------解决思路----------------------
Y7
------解决思路----------------------
Y8
------解决思路----------------------
Y9;
if (Y10 != 1) {
//打印符合要求的组合
printf("(%f,%d,%d,%d)\n", (p1 + i)->num, (p1 + i)->a, (p1 + i)->b, (p1 + i)->c);
printf("(%f,%d,%d,%d)\n", (p1 + j)->num, (p1 + j)->a, (p1 + j)->b, (p1 + j)->c);
printf("(%f,%d,%d,%d)\n", (p1 + k)->num, (p1 + k)->a, (p1 + k)->b, (p1 + k)->c);
printf("\n");
count++;
}
}
}
}
}
}
}
printf("总共有%d组合\n", count);
return 0;
}
------解决思路----------------------
其实就枚举一下排列
int a[10],vis[10];
void check_print(){
// 0/12 + 3/45 = 6/78
int den12=a[1]*10+a[2],
den45 =a[4]*10+a[5],
den78 =a[7]*10+a[8];
if((a[0]*den45+a[3]*den12)*den78==a[6]*den12*den45)
printf("%d/%d+%d/%d=%d/%d\n",a[0],den12,a[3],den45,a[6],den78);
}
void dfs(int d){
if(d==9) return check_print();
for(int i=1;i<10;i++) if(!vis[i]){
vis[i] =1;
a[d] =i;
dfs(d+1);
vis[i] =0;
}
}
//call
dfs(0)