VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 606|回复: 1

[求助] 神奇算式。求大神帮忙。

[复制链接]
79_avatar_middle
在线会员 发表于 2016-5-3 22:27:01 | 显示全部楼层 |阅读模式


    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。

    比如:

210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187




上一篇:有推荐资料吗?使用ActiveX开发IE网页插件!
下一篇:WSAAsyncSelect问题
74_avatar_middle
在线会员 发表于 2016-5-4 01:15:32 | 显示全部楼层
  1. // test_console.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <set>
  6. #include <string>

  7. //定義數字數量
  8. #define N 4

  9. bool check(const std::string& left,const std::string& right,const std::string& sv)
  10. {
  11.         if(sv.size() != N)
  12.         {
  13.                 return false;
  14.         }
  15.         std::set<char> key;
  16.         for(int i=0;i<N;++i)
  17.         {
  18.                 if (left.find(sv[i]) == std::string::npos &&
  19.                         right.find(sv[i]) == std::string::npos)
  20.                 {
  21.                         return false;
  22.                 }
  23.                 char c = sv[i];
  24.                 if(key.find(c)!=key.end())
  25.                 {
  26.                         return false;
  27.                 }
  28.                 key.insert(c);
  29.         }
  30.         return true;
  31. }
  32. void set_right(const std::string& left,std::string right,int i,int max,std::set<std::string>& str_key)
  33. {
  34.         if(left == "8"){
  35.                 int i=0;
  36.                 ++i;
  37.         }
  38.         for(char c='0';c<='9';++c)
  39.         {
  40.                 if(right.empty() && c == '0')
  41.                 {
  42.                         continue;
  43.                 }
  44.                 if(right.size() != i)
  45.                 {
  46.                         continue;
  47.                 }
  48.                
  49.                 if(left.find(c)!=std::string::npos)
  50.                 {
  51.                         continue;
  52.                 }
  53.                 if(right.find(c)!=std::string::npos)
  54.                 {
  55.                         continue;
  56.                 }

  57.                 std::string str = right;
  58.                 str.push_back(c);

  59.                 if(i==max)
  60.                 {
  61.                         //std::cout<<"left:"<<left<<"\tright:"<<str<<"\n";
  62.                         //計算乘積
  63.                         int il = atoi(left.c_str());
  64.                         int ir = atoi(str.c_str());
  65.                         char buf[100]={0};
  66.                         itoa(il*ir,buf,10);
  67.                         std::string sv = buf;

  68.                         //過濾 錯誤數字
  69.                         if(!check(left,str,sv))
  70.                         {
  71.                                 continue;
  72.                         }

  73.                         //過濾 重複數據
  74.                         if(str_key.find(left)!=str_key.end() || str_key.find(str)!=str_key.end())
  75.                         {
  76.                                 continue;
  77.                         }
  78.                         str_key.insert(left);
  79.                         str_key.insert(right);

  80.                         //顯示數據
  81.                         std::cout<<left<<"*"<<str<<"="<<sv<<"\n";
  82.                 }
  83.                 else
  84.                 {
  85.                         set_right(left,str,i+1,max,str_key);
  86.                 }
  87.         }
  88. }
  89. void set_left(std::string left,int i,int max,std::set<std::string>& str_key)
  90. {
  91.         for(char c='0';c<='9';++c)
  92.         {
  93.                 if(left.empty() && c == '0')
  94.                 {
  95.                         continue;
  96.                 }
  97.                 if(left.size() != i)
  98.                 {
  99.                         continue;
  100.                 }
  101.                
  102.                 if(left.find(c)!=std::string::npos)
  103.                 {
  104.                         continue;
  105.                 }
  106.                 std::string str = left;
  107.                 str.push_back(c);
  108.                 if(i==max)
  109.                 {
  110.                         //std::cout<<str<<"\n";
  111.                         std::string right;
  112.                         int left_max = N - max - 1 - 1;
  113.                         //設置 * 右邊 數字
  114.                         set_right(str,right,0,left_max,str_key);
  115.                 }
  116.                 else
  117.                 {
  118.                         set_left(str,i+1,max,str_key);
  119.                 }
  120.         }
  121. }
  122. int _tmain(int argc, _TCHAR* argv[])
  123. {
  124.         //設置key 過濾重複 數據
  125.         //(如 a*b 和 b*a 重複 過濾掉後者)
  126.         std::set<std::string> str_key;

  127.         //a*b 和 b*a 是重複的數據 故只需要 生成 N/2 的left 值
  128.         for(int max=0;max<N/2;++max)
  129.         {
  130.                 std::string str;
  131.                 //* 左邊數字 長度
  132.                 for(int i=0;i<=max;++i)
  133.                 {
  134.                         //設置 * 左邊數字
  135.                         set_left(str,i,max,str_key);
  136.                 }
  137.                
  138.         }

  139.         return 0;
  140. }
复制代码
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-20 02:19

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表