| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 726 人关注过本帖
标题:优美和式算法
只看楼主 加入收藏
justicesun
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2006-5-6
收藏
 问题点数:0 回复次数:8 
优美和式算法
在等式中,若数字0,1,2,3,4,5,6,7,8,9在a,b,c三个数中出现一次且只出现一次,这样的等式为优美和式,如:56+1987=2043,743+859=1602均为优美和式。设计程序求出所有的优美和式,并统计出优美和式的个数。

搜索更多相关主题的帖子: 和式 算法 
2006-05-14 17:59
justicesun
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2006-5-6
收藏
得分:0 
可能形式是a2b4c4和a3b3c4. 共有132个优美和式。
132个中包括了 a3 + b3 和 b3 + a3 即两数互换了位置的结果。
132个中没有包括 b4 + a2 的结果, 即两数互换位置的结果. 若加入,则增加 36种。

程序里在第一个打印语句下面加入下面两行即可.
(累加器加1,b和a 输出位置换一下)
n = n + 1;
printf("%d: %d+%d=%d\n",n,b,a,c);


C语言程序:
#include <stdio.h>
#include <stdlib.h>

main()
{
int a, b, c,i,j,n;
int ai[3],bi[4],ci[4];
// a2 b4 c4
n = 0;
for (a=10;a<=98;a++){
ai[0] = a / 10; ai[1] = a - ai[0] * 10;
if (ai[0] == ai[1]) goto Lab1;
for (b=1000;b<=9876;b++){
c = a + b;
if (c < 1000 || c >= 10000) goto Lab2;
bi[0] = b / 1000; bi[1] = (b - bi[0] * 1000) / 100;
bi[2] = (b - bi[0]*1000 - bi[1]*100) / 10;
bi[3] = b - bi[0] * 1000 - bi[1] * 100 -bi[2] * 10;
ci[0] = c / 1000; ci[1] = (c - ci[0] * 1000) / 100;
ci[2] = (c - ci[0]*1000 - ci[1]*100) / 10;
ci[3] = c - ci[0] * 1000 - ci[1] * 100 -ci[2] * 10;
for (i=0;i<2;i++){
for (j=0;j<=3;j++){if (ai[i] == bi[j]) goto Lab2;}
};
for (i=0;i<=2;i++){
for (j=i+1;j<=3;j++){
if (bi[i] == bi[j]) goto Lab2;
};
}; // end for i
for (i=0;i<=2;i++){
for (j=i+1;j<=3;j++){
if (ci[i] == ci[j]) goto Lab2;
};
}; // end for i
for (i=0;i<=3;i++){
for (j=0;j<=3;j++){if (ci[i] == bi[j]) goto Lab2;}
for (j=0;j<=1;j++){if (ci[i] == ai[j]) goto Lab2;}
};
n = n + 1;
printf("%d: %d+%d=%d\n",n,a,b,c);
Lab2:;
};
Lab1:;
};

// a3 b3 c4
for (a=100;a<=987;a++){
ai[0] = a / 100; ai[1] = (a - ai[0] * 100) / 10;
ai[2] = a - ai[0]*100 - ai[1]*10;
if (ai[0] == ai[1] || ai[0] == ai[2] || ai[1] == ai[2]) goto Lab11;
for (b=100;b<=987;b++){
c = a + b;
if (c < 1000 || c >= 10000) goto Lab22;
bi[0] = b / 100; bi[1] = (b - bi[0] * 100) / 10;
bi[2] = b - bi[0]*100 - bi[1]*10;
if (bi[0] == bi[1] || bi[0] == bi[2] || bi[1] == bi[2]) goto Lab22;

ci[0] = c / 1000; ci[1] = (c - ci[0] * 1000) / 100;
ci[2] = (c - ci[0]*1000 - ci[1]*100) / 10;
ci[3] = c - ci[0] * 1000 - ci[1] * 100 -ci[2] * 10;
for (i=0;i<=2;i++){
for (j=i+1;j<=3;j++){
if (ci[i] == ci[j]) goto Lab22;
};
}; // end for i
for (i=0;i<=2;i++){
for (j=0;j<=2;j++){if (ai[i] == bi[j]) goto Lab22;}
};
for (i=0;i<=3;i++){
for (j=0;j<=2;j++){if (ci[i] == bi[j]) goto Lab22;}
for (j=0;j<=2;j++){if (ci[i] == ai[j]) goto Lab22;}
};
n = n + 1;
printf("%d: %d+%d=%d\n",n,a,b,c);
Lab22:;
};
Lab11:;
};
}
答案:
1: 26+4987=5013
2: 27+4986=5013
3: 34+5978=6012
4: 34+5987=6021
5: 37+5984=6021
6: 38+5974=6012
7: 43+5978=6021
8: 47+2968=3015
9: 48+2967=3015
10: 48+5973=6021
11: 56+1978=2034
12: 56+1987=2043
13: 57+1986=2043
14: 58+1976=2034
15: 64+2987=3051
16: 65+1978=2043
17: 67+2948=3015
18: 67+2984=3051
19: 68+1975=2043
20: 68+2947=3015
21: 73+5948=6021
22: 74+5938=6012
23: 75+1968=2043
24: 76+1958=2034
25: 78+1956=2034
26: 78+1965=2043
27: 78+5934=6012
28: 78+5943=6021
29: 84+2967=3051
30: 84+5937=6021
31: 86+1957=2043
32: 86+4927=5013
33: 87+1956=2043
34: 87+2964=3051
35: 87+4926=5013
36: 87+5934=6021
37: 246+789=1035
38: 249+786=1035
39: 264+789=1053
40: 269+784=1053
41: 284+769=1053
42: 286+749=1035
43: 289+746=1035
44: 289+764=1053
45: 324+765=1089
46: 325+764=1089
47: 342+756=1098
48: 346+752=1098
49: 347+859=1206
50: 349+857=1206
51: 352+746=1098
52: 356+742=1098
53: 357+849=1206
54: 359+847=1206
55: 364+725=1089
56: 365+724=1089
57: 423+675=1098
58: 425+673=1098
59: 426+879=1305
60: 429+876=1305
61: 432+657=1089
62: 437+589=1026
63: 437+652=1089
64: 439+587=1026
65: 452+637=1089
66: 457+632=1089
67: 473+589=1062
68: 473+625=1098
69: 475+623=1098
70: 476+829=1305
71: 479+583=1062
72: 479+826=1305
73: 483+579=1062
74: 487+539=1026
75: 489+537=1026
76: 489+573=1062
77: 537+489=1026
78: 539+487=1026
79: 573+489=1062
80: 579+483=1062
81: 583+479=1062
82: 587+439=1026
83: 589+437=1026
84: 589+473=1062
85: 623+475=1098
86: 624+879=1503
87: 625+473=1098
88: 629+874=1503
89: 632+457=1089
90: 637+452=1089
91: 652+437=1089
92: 657+432=1089
93: 673+425=1098
94: 674+829=1503
95: 675+423=1098
96: 679+824=1503
97: 724+365=1089
98: 725+364=1089
99: 742+356=1098
100: 743+859=1602
101: 746+289=1035
102: 746+352=1098
103: 749+286=1035
104: 749+853=1602
105: 752+346=1098
106: 753+849=1602
107: 756+342=1098
108: 759+843=1602
109: 764+289=1053
110: 764+325=1089
111: 765+324=1089
112: 769+284=1053
113: 784+269=1053
114: 786+249=1035
115: 789+246=1035
116: 789+264=1053
117: 824+679=1503
118: 826+479=1305
119: 829+476=1305
120: 829+674=1503
121: 843+759=1602
122: 847+359=1206
123: 849+357=1206
124: 849+753=1602
125: 853+749=1602
126: 857+349=1206
127: 859+347=1206
128: 859+743=1602
129: 874+629=1503
130: 876+429=1305
131: 879+426=1305
132: 879+624=1503

Java
2006-05-14 18:00
justicesun
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2006-5-6
收藏
得分:0 
编译器:c-free

Java
2006-05-14 18:36
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
这个优什么的,也是老题了,见过了,
从图书馆里借了本非常古老的黄皮书,里面有,呵呵。
您这个程序让人看起来闷得慌,能改成函数就改成函数来用会清晰些.
还有printf("%d: %d+%d=%d\n",n,a,b,c);
改成这样printf("%04d: %d+%d=%d\n",n,a,b,c);
舒服些...

对不礼貌的女生收钱......
2006-05-15 16:06
工藤♀新一
Rank: 1
等 级:新手上路
帖 子:140
专家分:0
注 册:2006-5-4
收藏
得分:0 
看的头大了,
自己想的思路和LZ的完全不一样啊,
似乎自己的思路写起程序来更加困难...

很高兴能和大家一起学习程序! QQ:114109098
2006-05-17 10:37
fengleidongl
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-5-17
收藏
得分:0 

回二楼:(((if (c < 1000 || c >= 10000) goto Lab22;)))!

这可不是好习惯。还有风格问题。
2006-05-17 14:51
signjing
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-3-24
收藏
得分:0 
哇 好多呀
慢慢研究吧

我的QQ:395812618
2006-05-19 21:24
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

用了好多GOTO啊


2006-05-19 22:20
湖山觐
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2010-6-14
收藏
得分:0 
楼主的太复杂了吧,用了好几个goto,好好宣泄了一下~~~~~
我的:
//C code:
程序代码:
# include <stdio.h>

int main()
{
    int a,b,c,x,y,t,i,k,m[4],f[11],n=0;
    for(a=10;a<=987;++a)
        for(b=102;b<=9876;++b)
        {
            c=a+b;
            m[1]=a;m[2]=b;m[3]=c;

            for(i=0;i<10;i++) f[i]=0;

            for(k=1;k<=3;++k)
            {
                y=m[k];
                while(y>0)
                {
                    x=y%10;f[x]=f[x]+1;y/=10;      //分离各数字用f数组统计出现次数
                }
            }
            for(t=0,i=0;i<10;i++)
                if(f[i]!=1) t=1;

            if(t==0 && a<b)
            {
                printf("%3d+%4d=%4d  ",a,b,c);
                ++n;
                if(n%5==0) printf("\n");
            }
        }
    printf("\n\n共有%d组\n",n);
    return 0;
}
2011-07-26 11:27
快速回复:优美和式算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039923 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved