简单论证用数字生成.19191919419
-
写这个的原因
大概率因为wl,加上正好点到了魔茶的帖子发现类似东西本five以前也有过构思,于是就写了一个程序用来生成一些论证可能会用到的数据。另外其实大概三年前连"hello world"都不会的时候在贴吧看到过类似的帖子,当时觉得很酷w…
功能
生成长度不超过16位的数字的每一位的四则运算的组成的结果。注意这里是每一位数字。
如何实现
首先我们考虑这样一个喜闻乐见的数字
114514,如果我们要生成它的每一位数字进行四则运算的结果,可以考虑如下组成方案:
1+1+4+5+1+4,1+1+4+5+1-4,1+1+4+5,+1*4,1+1+4+5+1/4,为了方便观察规律,我们不妨将这
四个算式写成这样的形式:“+++++,++++ -,++++ *,++++/”。相信各位可以看出来,前四位的
操作符事一模一样的。如果继续写几个这样的式子,可以发现前几位相同的操作符的数量是会
越来越少的。
参考图
由此可以想到的算法
回溯算法,如果各位写过类似全排列,八
王子皇后之类的题或者是以类似的例子学习
回溯算法的话应该对这个算法并不陌生,这里并不详细介绍该算法,只是因为本five是用这个
算法写的所以提一下(屑颜)在获得操作符排列之后
将数字的每一位与获得的操作符排列拼接就能得到一个算式了,那么我们考虑下如何将这个算式算出来。
这里所谓的算式其实就是一个字符串,也就是不能直接获得结果的。一般而言我们可以通过各类算法将这个字符串算出来,但是因为本five智力泰国第几所以是不可能写出这么复杂的东西了。
那么考虑下Python,py里有一个函数叫eval,它的功能就是执行一串字符,然后返回对应的结果。于是可以考虑将我们生成的式子以文件形式保存,再放到py里运行得出结果。
最后分析下时间复杂度,不难发现一个长度为N的数字,如果要用四则运算符连接,需要用到N-1个运算符,一共有四种运算符,于是一个长度为N的数字,其每位数字的连接方案有4^(N-1)种,这就是理想的复杂度。
实际运行时间还要考虑到文件写入,所以会慢很多。本机上一个11位的数字(19191919419)得跑10s左右,而生成的文件大小在20M左右。
代码
Cwww
#include <iostream> #include <stdio.h> using namespace std; string nums, cs[4] = {"+", "-", "*", "/"}; FILE *f = fopen("./t.txt", "w"); void dfs(int level, int used, string str) { if (!used) { string res = ""; for (int i = 0; i < nums.size(); i++) res += nums[i], res += str[i]; fprintf(f, "%s\n", res.c_str()); return; } for (int i = 0; i < 4; i++) dfs(i, used - 1, str + cs[i]); } int main() { cout << "输入数字,请:"; cin >> nums; dfs(0, nums.size() - 1, ""); fclose(f); return 0; }
py
pt = r"" # 你的保存路径 sf = open(r"", "a+") # 你的文件路径 with open(pt, "r") as f: for line in f: sf.write(line[:-1] + " = " + str(round(eval(line), 2)) + "\n") sf.close()
食用方法
先运行遍CPP生成所有组合,再运行遍PY计算示例图
左图为生成答案后的文件,右图为生成答案前的文件(废话)
总结
写了半天还是没说清楚要干什么,全篇小学生版的感想…另外昨天快写完了的时候魔茶服务器崩了…
广告请注意
-
很强(确信)
-
正文那些不懂 但看tag就知道是上道的 www
-
@脚夫 全文只有tag是有价值的(
-
小游戏suki!不错的剧场 剧情还是有起伏的呢