一道c语言编程题求助...
观察下面的算式:△△△*△△=△△△△某3位数乘以2位数,结果为4位数要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。这道题用c语言怎么编写啊....编了好久...
观察下面的算式:
△△△ * △△ = △△△△
某3位数乘以2位数,结果为4位数
要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。
这道题用c语言怎么编写啊....编了好久了,哪位大神能编出来让我看看...最好注释能清楚些.... 展开
△△△ * △△ = △△△△
某3位数乘以2位数,结果为4位数
要求:在9个△所代表的数字中,1~9的数字恰好每个出现1次。
这道题用c语言怎么编写啊....编了好久了,哪位大神能编出来让我看看...最好注释能清楚些.... 展开
2个回答
展开全部
#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++编译器的话不需要那个头文件。
展开全部
#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;
}
鼓捣了半天,可算成了,你试一下~~~
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
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询