- 注册时间
- 2008-6-19
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 1806
- 在线时间
- 小时
|
发表于 2010-8-19 14:45:59
|
显示全部楼层
本帖最后由 没——问题 于 2010-8-19 15:44 编辑
-
- /**************************************************************************
- * 题目:紫罗兰算式
- * 设第一个数是“CLOVER”;
- * 第二个数是“CROCUS”;
- * 第三个数是“VIOLET”;
- * 其中第一个数与第二个数的和是第三个数,
- * 注意:相同的字母表示同一个数字,不同的字母
- * 表示不同的数字。每个字母的取值是从0到9的整数。
- * http://bbs.emath.ac.cn/viewthread.php?tid=2606&extra=&page=1
- * 分析:
- * 设所求的三个数为X,Y,Z,通过写做10的幂的和的形式可得到方程:
- * -99900*V+10*U-T+S+10001*R+1000*O+9900*L-10000*I+200100*C==0
- * 根据系数的正负分为两组:
- * 10*U+S+10001*R+1000*O+9900*L+200100*C==99900*V+T+10000*I
- * 对等式两边分别将所有可能的值写入数组left和right,并分别排序
- * 数组的每个元素除存储等式一侧的值外还需存储生成此值的变元的值
- * 寻找两组中相等的数,时间复杂度:10^6+10^3
- *************************************************************************/
- #include <stdlib.h>
- #include <stdio.h>
-
- typedef struct {int value,id;} group;//value为等式一侧的值,id为一侧变量的值依次排列在一起组成的十进制数字的值
- int cmp(const void *a, const void *b){return ((group *)a)->value - ((group *)b)->value;}//从小到大排序
-
- int main()
- {
- int u,s,r,o,l,c,v,t,i;
- group left[1000000],*pl=left,right[1000],*pr=right;
- for(v=0;v<10;v++)for(t=0;t<10;t++)for(i=0;i<10;i++)
- {
- pr->value=99900*v+t+10000*i;
- pr->id=v*100+10*t+i;
- pr++;
- for(o=0;o<10;o++)for(l=0;l<10;l++)for(c=0;c<10;c++)
- {
- pl->value=10*v+t+10001*i+1000*o+9900*l+200100*c;
- pl->id=v*100000+t*10000+i*1000+o*100+l*10+c;
- pl++;
- }
- }
-
- qsort(left, 1000000, sizeof(group), cmp);
- qsort(right, 1000, sizeof(group), cmp);
-
- printf("ulrolc,vti\n----------\n");
- for(pl--,pr--;pl!=left&&pr!=right;)
- {
- if(pl->value==pr->value)
- //输出变元的值,此处没有排除使得X,Y,Z中出现前导零的答案.
- printf("%06d,%03d\n",pl->id,pr->id),pl--,pr--;
- if(pl->value > pr->value)pl--;else pr--;
- }
-
- return 0;
- }
复制代码 我这里是1秒以内
real 0m0.446s
user 0m0.340s
sys 0m0.012s |
|