高分悬赏关于MATLAB的一个小问题,能者帮忙啊!

○○○○×○=○○○○
一个圆圈填入一个数字,将1-9九个数字不重复的填入圈中,使其满足上述等式。
如何用MATLAB编制一个小程序满足上述要求,算出结果呢?
还有,谁能告诉我,如果用C语言实现这个程序,又该怎么样写代码呢?

clear;clc;A=perms(1:9);
A=A((1000*A(:,1)+100*A(:,2)+10*A(:,3)+A(:,4)).*A(:,5)==1000*A(:,6)+100*A(:,7)+10*A(:,8)+A(:,9),:);
disp([num2str(1000*A(:,1)+100*A(:,2)+10*A(:,3)+A(:,4)) repmat('*',size(A,1),1) num2str(A(:,5)) repmat('=',size(A,1),1) num2str(1000*A(:,6)+100*A(:,7)+10*A(:,8)+A(:,9))])

若用C:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
main()
{
int i,j,n=9,postion;
int *a,*flag,*p;
long m=0,fun_m=1;

system("cls");

a=(int *)calloc(n-1,sizeof(int));
flag=(int *)calloc(n,sizeof(int));
p=(int *)calloc(n,sizeof(int));
if (!a&&!flag&&!p)
{
printf("calloc error:\nPress any key exit:");
getch();
exit(0);
}
for (i=0;i<n;i++,fun_m*=i)
a[i]=0;
for (m=0;m<fun_m;m++)
{
for (i=2;i<=n;i++)
{
a[n-i]=(a[n-i]+1)%i;
if (a[n-i])
break;
}
for (i=0;i<n;i++)
flag[i]=0;
for (i=n;i>1;i--)
{
postion=n-1-a[n-i];
for (j=n-1;j>=postion;j--)
if (flag[j])
postion--;
p[postion]=i;
flag[postion]=1;
}
for (i=0;i<n;i++)
if (!flag[i])
p[i]=1;
/*以上产生全排列的一个数*/

if ((long)(p[0]*1000+p[1]*100+p[2]*10+p[3])*p[4]==p[5]*1000+p[6]*100+p[7]*10+p[8])
{
for (i=0;i<4;i++)
printf("%d",p[i]);
printf("*%d=",p[4]);
for (i=5;i<9;i++)
printf("%d",p[i]);
printf("\n");
}
}
getch();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-03-13
C语言,一种方法就是你用9个变量,然后,一个个变量从1到9
判断,这九个变量各不相同时,再判断你的那个式子是否成立。
这种方法的缺陷在于,你判断这九个变量各不相等,很累。

另一种方法,也是产生它的全排列。
具体的方法有好多种。

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
main()
{
int i,j,n=9,postion;
int *a,*flag,*p;
long m=0,fun_m=1;

system("cls");

a=(int *)calloc(n-1,sizeof(int));
flag=(int *)calloc(n,sizeof(int));
p=(int *)calloc(n,sizeof(int));
if (!a&&!flag&&!p)
{
printf("calloc error:\nPress any key exit:");
getch();
exit(0);
}
for (i=0;i<n;i++,fun_m*=i)
a[i]=0;
for (m=0;m<fun_m;m++)
{
for (i=2;i<=n;i++)
{
a[n-i]=(a[n-i]+1)%i;
if (a[n-i])
break;
}
for (i=0;i<n;i++)
flag[i]=0;
for (i=n;i>1;i--)
{
postion=n-1-a[n-i];
for (j=n-1;j>=postion;j--)
if (flag[j])
postion--;
p[postion]=i;
flag[postion]=1;
}
for (i=0;i<n;i++)
if (!flag[i])
p[i]=1;
/*以上产生全排列的一个数*/

if ((long)(p[0]*1000+p[1]*100+p[2]*10+p[3])*p[4]==p[5]*1000+p[6]*100+p[7]*10+p[8])
{
for (i=0;i<4;i++)
printf("%d",p[i]);
printf("*%d=",p[4]);
for (i=5;i<9;i++)
printf("%d",p[i]);
printf("\n");
}
}
getch();
}
第2个回答  2009-03-13
clear;clc;A=perms(1:9);
A=A((1000*A(:,1)+100*A(:,2)+10*A(:,3)+A(:,4)).*A(:,5)==1000*A(:,6)+100*A(:,7)+10*A(:,8)+A(:,9),:);
disp([num2str(1000*A(:,1)+100*A(:,2)+10*A(:,3)+A(:,4)) repmat('*',size(A,1),1) num2str(A(:,5)) repmat('=',size(A,1),1) num2str(1000*A(:,6)+100*A(:,7)+10*A(:,8)+A(:,9))])

用c就只能for循环了
相似回答
大家正在搜