一道c语言编程题求助...

2024-11-27 03:46:09
推荐回答(2个)
回答1:

#include 
#include 

void calc(int p[9])
{
    if (p[0] == 0       // 为了保证第一个数为三位数
        || p[3] == 0    // 为了保证第二个数为两位数
        || p[5] == 0) { // 为了保证第三个数为四位数
        return ;
    }
    int num[3] = {0};
    num[0] = p[0] * 100 + p[1] * 10 + p[2];
    num[1] = p[3] * 10 + p[4];
    num[2] = p[5] * 1000 + p[6] * 100 + p[7] * 10 + p[8];
    if (num[0] * num[1] == num[2]) {
        printf ("%d * %d == %d\n", num[0], num[1], num[2]);
    }
}

// 检查p[k]这个值在p[0]~p[k-1]中是否出现过,出现过返回true
bool is_used(int p[9], int k)
{
    int i;
    for (i = 0; i < k; i++) {
        if (p[i] == p[k]) {
            return true;
        }
    }
    return false;
}

int main(int argc, char *argv[])
{
    int p[9] = {0};
    int k = 0;
    p[k] = -1;

    // 回溯法
    while (k >= 0) {
        for (p[k]++; p[k] <= 9; p[k]++) { // 这个for循环是找当前p[k]的值
            if (!is_used(p, k)) {         // 且不能与前面已有的数重复
                break;
            }
        }
        if (p[k] > 9) {      // 如果数字超出范围,回退
            p[k--] = -1;
        } else if (k == 8) { // 达到所需规模,计算
            calc(p);
        } else {             // 否则,一切正常,前进
            p[++k] = -1;
        }
    }
    return 0;
}

这种解法用到的算法是回溯法,你可以在网上先查一下这种算法。

它差不多是万能算法,如果一时找不到更好的算法,那就用它了。

回答2:

#include

const int NUM = 9;

void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{

if((list[m-8]*100+list[m-7]*10+list[m-6])*(list[m-5]*10+list[m-4])==(list[m-3]*1000+list[m-2]*100+list[m-1]*10+list[m]))
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
}
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[NUM];
for(int i = 0 ; i < NUM ; ++i)
list[i] = i+1;
perm(list, 0, NUM - 1);
return 0;
}
鼓捣了半天,可算成了,你试一下~~~