wdcsss 发表于 2009-6-5 08:58:53

难求的一个等式

“(23×10+46÷2)-(189×3+67) =389 ”是个错误的等式,移动一个"数字"使得等式成立。

winxos 发表于 2009-6-5 10:59:03

是移动一个数字,不是交换一个数字吧?

gxqcn 发表于 2009-6-5 11:12:56

我记得一个比较经典的例子是移动一个数字使“62-1=63”成立,
答案是将“2”前面的“6”移到其右肩上。

shshsh_0510 发表于 2009-6-5 15:55:03

3# gxqcn


好像就是这种方法
2*10^3

gxqcn 发表于 2009-6-5 15:59:45

还不对。

这样左边将=1389,还多了个数字“1”。

shshsh_0510 发表于 2009-6-5 16:18:08

呵呵,算错了

gxqcn 发表于 2009-6-5 16:40:09

不过,已非常“神似”相等了,不容易。

mathe 发表于 2009-6-5 16:56:16

如果仅仅移动一个数字(可以变成指数)但是不允许移动任意操作符,或者丢弃一个数字,或者用一个数字覆盖另外一个数字,无解
// 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;
}

mathe 发表于 2009-6-5 16:57:21

也许一种取巧的方法是将一个1移动到=上面(这样看起来有点像不等号了).不过结果就不是等式了

wdcsss 发表于 2009-6-6 05:54:26

大家再认真考虑一下
页: [1] 2
查看完整版本: 难求的一个等式