难求的一个等式
“(23×10+46÷2)-(189×3+67) =389 ”是个错误的等式,移动一个"数字"使得等式成立。 是移动一个数字,不是交换一个数字吧? 我记得一个比较经典的例子是移动一个数字使“62-1=63”成立,答案是将“2”前面的“6”移到其右肩上。 3# gxqcn
好像就是这种方法
2*10^3 还不对。
这样左边将=1389,还多了个数字“1”。 呵呵,算错了 不过,已非常“神似”相等了,不容易。 如果仅仅移动一个数字(可以变成指数)但是不允许移动任意操作符,或者丢弃一个数字,或者用一个数字覆盖另外一个数字,无解
// md.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <math.h>
int d={23,10,46,2,189,3,67,389};
int e;
int s={0,0,10,100};
void test_value()
{
if(e==0)return;
int s=e*e+e/e-(e*e+e)-e;
if(s==0){
printf("(%d*%d+%d/%d)-(%d*%d+%d)=%d\n",e,e,e,e,e,e,e,e);
}
}
void try_insert_h(int h)
{
int i,j;
test_value();
for(i=0;i<8;i++){
int olde=e;
for(j=0;j<=3;j++){
if(olde>=s){
switch(j){
case 0:
e=olde*10+h;
break;
case 1:
e=(olde/10)*100+h*10+olde%10;
break;
case 2:
e=(olde/100)*1000+h*100+olde%100;
break;
case 3:
e=h*1000+olde;
break;
}
test_value();
}
}
for(j=0;j<=2;j++){
if(olde>=s){
switch(j){
case 0:
e=(olde/10)*10+h;
break;
case 1:
e=(olde/100)*100+h*10+olde%10;
break;
case 2:
e=h*100+olde%100;
break;
}
test_value();
}
}
double d=pow((double)olde,h);
if(d<=100000.0){
e=(int)d;
test_value();
}
e=olde;
}
}
void try_move_one_digit(int x)
{
int i,j,u,h;
if(d<100){
u=2;
}else{
u=3;
}
for(i=0;i<u;i++){
for(j=0;j<8;j++)e=d;
switch(i){
case 0:
h=d%10;
e=d/10;
break;
case 1:
h=(d/10)%10;
e=d-h*10;
break;
case 2:
h=d/100;
e=d%100;
break;
}
try_insert_h(h);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
for(i=0;i<8;i++){
if(d>=10){
try_move_one_digit(i);
}
}
return 0;
}
也许一种取巧的方法是将一个1移动到=上面(这样看起来有点像不等号了).不过结果就不是等式了 大家再认真考虑一下
页:
[1]
2