用最基本的c语言编程。将1-9这九个数分为三个三位数,要求第一个3位数,正好是第二个三位数的三倍,

2024-11-28 23:55:33
推荐回答(5个)
回答1:

先给出结果:

代码思路:

对元素为1-9的数组进行位置交换,递归求出全排列,对每一个排列结果检查是否存在题目提出的关系,存在则输出结果。

代码实现如下:

#include 
#include 

#define N 9

uint8_t arrayRaw[N];
uint16_t num1 = 0, num2 = 0, num3 = 0;
uint32_t index = 0;

void print();
void perm(int); /*求数组的全排列 */
void swap(int, int);

void print(void)
{
uint16_t i;

printf("[%d]", index);
for (i = 0; i < N; ++i)
{
printf(" %d ", arrayRaw[i]);
}
printf("\n");
}

void trible_check(void)
{
num1 = arrayRaw[0] * 100 + arrayRaw[1] * 10 + arrayRaw[2];
num2 = arrayRaw[3] * 100 + arrayRaw[4] * 10 + arrayRaw[5];
num3 = arrayRaw[6] * 100 + arrayRaw[7] * 10 + arrayRaw[8];

if ( (num1*2 == num2) && (num1*3 == num3) )
{
print();
printf("num1=%d\r\n", num1);
printf("num2=%d\r\n", num2);
printf("num3=%d\r\n", num3);
}
}

void swap(int i, int offset)
{
int temp;

temp = arrayRaw[offset];
arrayRaw[offset] = arrayRaw[i];
arrayRaw[i] = temp;
}

void perm(int offset)
{
uint16_t i;

if (offset == N - 1)  // BaseCase
{
index++;
//  print();
trible_check();
return;
}
else
{
for (i = offset; i < N; ++i)
{
swap(i, offset);//交换前缀
perm(offset + 1);//递归
swap(i, offset);//将前缀换回来,继续做前一次排列
}
}
}

int main()
{
uint16_t i;

for (i = 0; i < N; ++i)
{
arrayRaw[i] = i + 1;
}
perm(0);
printf("index=%d\r\n", index);

        return 0;
}

回答2:

题意是如此我就这样写了,最基础的语句,

回答3:

是不是第二个是第一个的2倍,第三个是第一个的3倍

回答4:

#include
void dfs(int step,int a[10],int book[10]);
int main()
{
int a[11],book[10]={0};
printf("0");
dfs(0,a+1,book);
system("pause");
return 0;
}
void dfs(int step,int a[10],int book[10])
{
int i;
if(step>=10)
{
if(2*(a[0]*100+a[1]*10+a[2])==(a[3]*100+a[4]*10+a[5])&&3*(a[0]*100+a[1]*10+a[2])==(a[6]*100+a[7]*10+a[8]))
printf("%d,%d,%d\n",a[0]*100+a[1]*10+a[2],a[3]*100+a[4]*10+a[5],a[6]*100+a[7]*10+a[8]);
return;
}
for(i=0;i<10;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1,a,book);
book[i]=0;
}
}
return;
}

回答5:

192 384 576
219 438 657
273 546 819
327 654 981

只有这几个数。