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

观察下面的算式:△△△*△△=△△△△某3位数乘以2位数,结果为4位数要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。这道题用c语言怎么编写啊....编了好久... 观察下面的算式:
△△△ * △△ = △△△△
某3位数乘以2位数,结果为4位数
要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。
这道题用c语言怎么编写啊....编了好久了,哪位大神能编出来让我看看...最好注释能清楚些....
展开
 我来答
小坏蛋宽guy
推荐于2016-11-05 · TA获得超过300个赞
知道小有建树答主
回答量:239
采纳率:66%
帮助的人:138万
展开全部
#include <stdio.h>
#include <stdbool.h>

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;
}

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

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

追问
这个头文件报错...#include 
追答
我用的是linux系统,需要包含那个头文件才能用bool类型,你如果用windows或者linux下的g++编译器的话不需要那个头文件。
ningai007
2014-09-02 · TA获得超过1.6万个赞
知道大有可为答主
回答量:1890
采纳率:0%
帮助的人:286万
展开全部
#include <stdio.h>

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;
}
鼓捣了半天,可算成了,你试一下~~~
追问
看不懂啊....没注释...并且报这个错误fatal error LNK1169: one or more multiply defined symbols found
追答

可是我运行成功了~~~用的vc6.0

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式