问一道简单的C语言题目输入正整数n,按从小到大的顺序输出所有形如 abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/22 21:46:16
问一道简单的C语言题目输入正整数n,按从小到大的顺序输出所有形如 abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2
问一道简单的C语言题目
输入正整数n,按从小到大的顺序输出所有形如 abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2
问一道简单的C语言题目输入正整数n,按从小到大的顺序输出所有形如 abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2
可用递归方式实现,代码如下:
#include <stdio.h>
#define NUM_CHOOSE 100
#define DEN_CHOOSE 1000
void printResult(const int allow[10],int n)
{
int num[5];
int den[5];
int numChoose;
int denChoose;
long numV = 0;
long denV = 0;
for(int i=0;i<10;i++){
numChoose = (int)(allow[i]/NUM_CHOOSE)%10;
if(numChoose) {
num[numChoose-1] = i;
}else{
denChoose = (int)(allow[i]/DEN_CHOOSE)%10;
if(denChoose) den[denChoose-1] = i;
}
}
for(int i=0;i<5;i++){
numV = 10*numV + num[4-i];
}
for(int i=0;i<5;i++){
denV = 10*denV + den[4-i];
}
if(numV/denV==n){
printf("%05d/%05d\n",numV,denV);
}
}
void getFactor(int n,int k,int allow[10],int level)
{
for(int i=0;i<10;i++){// 分子
if(allow[i]!=i) continue;
for(int j=0;j<10;j++){ // 分母
if(allow[j]!=j || j==i) continue;
if(((n*i-j)+k)%10==0){
allow[i] += DEN_CHOOSE*level;
allow[j] += NUM_CHOOSE*level;
if(level==5){
printResult(allow,n);
}else{
getFactor(n,((n*i-j)+k)/10,allow,level+1);
}
allow[i] -= DEN_CHOOSE*level;
allow[j] -= NUM_CHOOSE*level;
}
}
}
return;
}
int main()
{
int nb[10] = {0,1,2,3,4,5,6,7,8,9};
getFactor(2,0,nb,1); // 2可以改为2-79间数
}
运行结果如图: