求解,用0-9组成乘法竖式

xiachm 2008-06-25 03:03:01
有如下一个算式,在下面的乘法竖式里面填上0-9共十个数,每个数字不能重复,使算式成立,用C语言实现。

口口
X 口口口
==========
口口口口口
...全文
539 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sprague 2008-06-28
  • 打赏
  • 举报
回复
for(j=10234/i; j <988; j++)
这是要做什么,能给讲讲吗???
[Quote=引用 9 楼 xibeitianlang 的回复:]
#include <stdio.h>
main()
{
int i,j,k,a,b,c;
long m,n;
for(i=20; i <99; i++)
{
a=i/10; b=i%10;
if(a==b) continue;
for(j=10234/i; j <988; j++)
{
c=1 < <a ¦1 < <b;
c ¦=1 < <(j/100) ¦1 < <(j/10%10) ¦1 < <(j%10);
m=(long)i*j; n=m;
for(k=0; k <5; k++)
{
c ¦=1 < <(n%10); n/=10;
}
if(c==1023)
printf("%6d\n X%4d\n=======\n%6u\n\n",i,j,m);
}
}
}
TC2运行结果:
27

[/Quote]
grellen 2008-06-28
  • 打赏
  • 举报
回复
up
xibeitianlang 2008-06-27
  • 打赏
  • 举报
回复
#include<stdio.h>
main()
{
int i,j,k,a,b,c;
long m,n;
for(i=20; i<99; i++)
{
a=i/10; b=i%10;
if(a==b) continue;
for(j=10234/i; j<988; j++)
{
c=1<<a|1<<b;
c|=1<<(j/100)|1<<(j/10%10)|1<<(j%10);
m=(long)i*j; n=m;
for(k=0; k<5; k++)
{
c|=1<<(n%10); n/=10;
}
if(c==1023)
printf("%6d\n X%4d\n=======\n%6u\n\n",i,j,m);
}
}
}
TC2运行结果:
27
X 594
=======
16038

36
X 495
=======
17820

39
X 402
=======
15678

45
X 396
=======
17820

46
X 715
=======
32890

52
X 367
=======
19084

54
X 297
=======
16038

63
X 927
=======
58401

78
X 345
=======
26910
xibeitianlang 2008-06-27
  • 打赏
  • 举报
回复
#include<stdio.h>
main()
{
int i,j,k,a,b,c;
long m,n;
for(i=20; i<99; i++)
{
a=i/10; b=i%10;
if(a==b) continue;
for(j=10234/i; j<988; j++)
{
c=1<<a|1<<b;
c|=1<<(j/100)|1<<(j/10%10)|1<<(j%10);
m=(long)i*j; n=m;
for(k=0; k<5; k++)
{
c|=1<<(n%10); n/=10;
}
if(c==1023)
printf("%6d\n X%4d\n=======\n%6u\n\n",i,j,m);
}
}
}
TC2运行结果:
27
X 594
=======
16038

36
X 495
=======
17820

39
X 402
=======
15678

45
X 396
=======
17820

46
X 715
=======
32890

52
X 367
=======
19084

54
X 297
=======
16038

63
X 927
=======
58401

78
X 345
=======
26910
sprague 2008-06-26
  • 打赏
  • 举报
回复
兄弟,感觉应该是16组,加油,轮询当然行,在想其他方法,另外,前一个轮询稍加点判断吧,这样太。。。
The 1th answer:
12
* 483
===========
05796

The 2th answer:
18
* 297
===========
05346

The 3th answer:
27
* 198
===========
05346

The 4th answer:
27
* 594
===========
16038

The 5th answer:
28
* 157
===========
04396

The 6th answer:
36
* 495
===========
17820

The 7th answer:
39
* 186
===========
07254

The 8th answer:
39
* 402
===========
15678

The 9th answer:
42
* 138
===========
05796

The 10th answer:
45
* 396
===========
17820

The 11th answer:
46
* 715
===========
32890

The 12th answer:
48
* 159
===========
07632

The 13th answer:
52
* 367
===========
19084

The 14th answer:
54
* 297
===========
16038

The 15th answer:
63
* 927
===========
58401

The 16th answer:
78
* 345
===========
26910
xibeitianlang 2008-06-26
  • 打赏
  • 举报
回复
循环次数就可以直接优化。
for(i=20; i<99; i++)
{ if i个位、十位不同
{ for j=10234/i; j<988; j++)
{ if j个位、十位、百位两两不同 且 k=i*j各位数上的数字两两不同 并且 i,j,k相互间数字不同
printf(" %2d\nX %3d\n======\n%d",i,j,k);
}
}
}
heroful 2008-06-26
  • 打赏
  • 举报
回复
int a[5],iFlag=10,b[2],c[3],iControl=5;//iFlag控制结果值,iControl控制结果与乘数和被乘数不相等
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for (int i=10;i<=99;i++)
{
b[0]=i/10,b[1]=i%10;
if (b[0]!=b[1]&&b[1]!=0)
for (int j=100;j<=999;j++)
{
c[0]=j/100;
c[1]=j/10%10;
c[2]=j%10;
if (c[0]!=c[1] && c[1]!=c[2] && c[0]!=c[2]&& c[2]!=0)
if(c[0]!=b[0]&&c[0]!=b[1] && c[1]!=b[0]&&c[1]!=b[1] && c[2]!=b[0]&& c[2]!=b[1])
{
a[0]=(i*j)%10;
a[1]=(i*j)/10%10;
a[2]=(i*j)/100%10;
a[3]=(i*j)/1000%10;
a[4]=(i*j)/10000;
iControl=5;
for (int l=0;l<5;l++)
if (a[l]!=c[0]&&a[l]!=c[1]&&a[l]!=c[2]&&a[l]!=b[0]&&a[l]!=b[1])
iControl--;
else
iControl++;
if (iControl==0)
{
iFlag=10;
for(int m=0;m<5;m++)
for(int n=m+1;n<5;n++)
if (a[m]!=a[n])
iFlag--;
else
iFlag++;

if(iFlag==0)
printf("%d%c%d%c%d ",i,'*',j,'=',i*j);
}
}
}
}
xibeitianlang 2008-06-26
  • 打赏
  • 举报
回复
首先它是一个算式!最高位是0的竖式没见过。
sprague 2008-06-26
  • 打赏
  • 举报
回复
每个数字不能重复,使算式成立
xibeitianlang 2008-06-26
  • 打赏
  • 举报
回复
万位上为0,不妥吧!
  • 打赏
  • 举报
回复
27*594==16038
36*495==17820
39*402==15678
45*396==17820
46*715==32890
52*367==19084
54*297==16038
63*927==58401
78*345==26910


for(int i=10; i<=99; i++)
{
for(int j=100; j<=999; j++)
{
if (i*j>=10000 and i*j<=99999 and (i,j,i*j中的数字无重复))
找到一组满足要求的解;
}
}

对重复数字的判断可以更早就开始进行(比如i=11本身就重复、i=10和j=100两者有重复),效率会更好一些。
不过这题计算量本来就没多少。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧