QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

微信扫一扫 分享朋友圈

已有 218 人浏览分享

开启左侧

PHP:用0-9共10个数字凑成四则运算式,每个数有且仅出现1次

[复制链接]
218 0
image.jpg
  近日,在网上看到一个编程题,就是用0-9共10个数字,凑成一个四则运算的等式,整个等式里面,这10个数字有且仅出现一次。四则运算加减乘除都可以。实际上加减本质上是一样的,乘除也是一样的,只需要调换一个位置即可。
  那如何做呢?最笨的办法就是搞循环,然后提取整个等式里面的数字,检测数字是否有重复,当有10个数字,且不重复的时候,那么这个等式就符合要求了。为了方便测试,这里用PHP实现:
  1. <?php
  2. /**
  3. * 检查数组中是否存在相同的数字。
  4. *
  5. * @param array $a 输入的数组。
  6. * @return bool 如果存在相同的数字则返回true,否则返回false。
  7. */
  8. function have_same_number($a)
  9. {
  10.     for ($i = 0; $i < count($a); $i++) {
  11.         for ($j = $i + 1; $j < count($a); $j++) {
  12.             if ($a[$i] == $a[$j]) {
  13.                 return true;
  14.             }
  15.         }
  16.     }
  17.     return false;
  18. }

  19. /**
  20. * 将字符串转换为字符数组。
  21. *
  22. * @param string $str 输入的字符串。
  23. * @return array 返回包含字符串中每个字符的数组。
  24. */
  25. function str_to_array($str)
  26. {
  27.     $arr = [];
  28.     for ($i = 0; $i < strlen($str); $i++) {
  29.         $arr[] = $str[$i];
  30.     }
  31.     return $arr;
  32. }

  33. $zongshu = 0; // 总计数,用于记录满足条件的乘法结果数量
  34. $start_time = microtime(true); // 记录开始时间,用于计算执行耗时

  35. // 大循环遍历所有可能的乘法操作
  36. for ($a = 0; $a < 10000; $a++) {
  37.     for ($b = 0; $b < 10000; $b++) {
  38.         $c = $a * $b; // 计算乘法结果
  39.         $d = strval($a) . strval($b) . strval($c); // 将乘法操作数和结果转换为字符串并拼接

  40.         // 检查拼接后的字符串中是否包含重复的数字
  41.         if (!have_same_number(str_to_array($d))) {
  42.             continue; // 如果包含重复数字,则跳过当前循环
  43.         }

  44.         // 检查结果字符串的长度是否小于10,如果是,则跳过当前循环
  45.         if (strlen($d) < 10) {
  46.             continue;
  47.         }

  48.         // 如果结果字符串长度大于10,则结束当前循环
  49.         if (strlen($d) > 10) {
  50.             break;
  51.         } else {
  52.             echo "{$a} * {$b} = {$c}\n"; // 输出满足条件的乘法表达式
  53.             $zongshu += 1; // 增加总计数
  54.         }
  55.     }
  56. }
  57. echo "计算完毕,总共有{$zongshu}组,耗时:" . (microtime(true) - $start_time) . "秒"; // 输出总计数和执行耗时
  58. ?>
复制代码
代码里面只展示了乘法运算,加法的自己改一下即可。最终的运行结果如下:
image.jpg
附上python代码,与php相比慢了几秒,总体感觉执行时间差不多。
  1. # 导入time模块以获取当前时间  
  2. import time

  3. def have_same_number(a):  
  4.     """检查数组中是否存在相同的数字。"""  
  5.     # 将数组转换为集合,自动去除重复元素  
  6.     unique_elements = set(a)  
  7.     # 比较原数组长度和集合长度,如果不相等,则说明有重复元素  
  8.     return len(a) != len(unique_elements)  
  9.   
  10. def str_to_array(str):  
  11.     """将字符串转换为字符列表。"""  
  12.     return list(str)  
  13.   
  14. zongshu = 0  # 总计数,用于记录满足条件的乘法结果数量  
  15. start_time = time.time()  # 记录开始时间,用于计算执行耗时  
  16.   
  17. # 大循环遍历所有可能的乘法操作  
  18. for a in range(10000):  
  19.     for b in range(10000):  
  20.         c = a * b  # 计算乘法结果  
  21.         d = str(a) + str(b) + str(c)  # 将乘法操作数和结果转换为字符串并拼接  
  22.   
  23.         # 检查拼接后的字符串中是否包含重复的数字  
  24.         if not have_same_number(str_to_array(d)):  
  25.             # 检查结果字符串的长度是否等于10  
  26.             if len(d) == 10:  
  27.                 print(f"{a} * {b} = {c}")  # 输出满足条件的乘法表达式  
  28.                 zongshu += 1  # 增加总计数
  29.             else:
  30.                 if len(d) > 10:  
  31.                     break
  32.                 continue
  33.   
  34. # 注意:原PHP代码中对于长度大于10的处理(break)在Python版本中是不必要的,  
  35. # 因为我们只关心长度为10的字符串。  
  36.   
  37. print(f"计算完毕,总共有{zongshu}组,耗时:{time.time() - start_time}秒")  # 输出总计数和执行耗时
复制代码
再附一段delphi12编译通过的代码,发现效率惊人,整个算完只用了127毫秒!

  1. program Project1;

  2. {$APPTYPE CONSOLE}

  3. uses
  4.   SysUtils, StrUtils;

  5. // 检查数组中是否存在相同的数字
  6. function HaveSameNumber(const a: TArray<Integer>): Boolean;
  7. var
  8.   i, j: Integer;
  9. begin
  10.   for i := Low(a) to High(a) - 1 do
  11.     for j := i + 1 to High(a) do
  12.       if a[i] = a[j] then
  13.         Exit(True);
  14.   Result := False;
  15. end;

  16. // 将字符串转换为字符数组
  17. function StrToArray(const str: string): TArray<Integer>;
  18. var
  19.   i: Integer;
  20. begin
  21.   SetLength(Result, Length(str));
  22.   for i := 0 to Length(str) - 1 do
  23.     Result[i] := StrToInt(str[i + 1]);
  24. end;

  25. var
  26.   zongshu: Integer;
  27.   startTime: TDateTime;
  28.   a, b, c: Integer;
  29.   d: string;
  30.   charArray: TArray<Integer>;

  31. begin
  32.   zongshu := 0;
  33.   startTime := Now;
  34.   // 大循环遍历所有可能的乘法操作
  35.   for a := 0 to 9999 do
  36.     for b := 0 to 9999 do
  37.     begin
  38.       c := a * b;
  39.       d := IntToStr(a) + IntToStr(b) + IntToStr(c);
  40.       if Length(d) < 10 then
  41.           Continue;
  42.       if Length(d) > 10 then
  43.           Break;
  44.       charArray := StrToArray(d);
  45.       if not HaveSameNumber(charArray) then
  46.       begin
  47.         WriteLn(Format('%d * %d = %d', [a, b, c]));
  48.         Inc(zongshu);
  49.       end;
  50.     end;
  51.   // 输出总计数和执行耗时
  52.   WriteLn('计算完毕,总共有' + IntToStr(zongshu) + '组,耗时:' + FormatDateTime('hh:nn:ss.zzz', Now - startTime));
  53.   ReadLn;
  54. end.
复制代码
image.jpg

上一篇:三国志10威力加强版游戏修改器,掌控一切基本上啥都能改
下一篇:免费VCF生成工具,TXT或EXCEL转换成VCF手机电话簿文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

37

关注

177

粉丝

14203

主题
精彩推荐
热门资讯
网友晒图
  • 公众号

    微信公众号

  • 微信

    站长微信

Powered by Discuz! 在此致以诚挚谢意!

CopyRight © 2011-2024 wancili.com