您现在还未登录!

登录/注册后体验更多内容。如未找到验证邮件,请查看垃圾箱或"点击右上角头像"-->"编辑资料"重新发送。

PS:密码找回重做中,目前请通过此处来找回。

遇到其它BUG请直接点此反馈。

QQ邮箱将无法在移动端注册或验证,使用WEB版即可。请使用非国产浏览器(例:Chrome/Firefox)登录。

简单论证用数字生成.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,为了方便观察规律,我们不妨将这
    四个算式写成这样的形式:“+++++,++++ -,++++ *,++++/”。相信各位可以看出来,前四位的
    操作符事一模一样的。如果继续写几个这样的式子,可以发现前几位相同的操作符的数量是会
    越来越少的。
    参考图
    8f2fe6f5-4d0b-4523-b536-197e59b14473-image.png

    由此可以想到的算法

    回溯算法,如果各位写过类似全排列,八王子皇后之类的题或者是以类似的例子学习
    回溯算法的话应该对这个算法并不陌生,这里并不详细介绍该算法,只是因为本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计算

    示例图
    左图为生成答案后的文件,右图为生成答案前的文件(废话)
    942b1ac3-0515-4277-96d0-013decf7f275-image.png

    总结

    写了半天还是没说清楚要干什么,全篇小学生版的感想…另外昨天快写完了的时候魔茶服务器崩了…

    广告请注意

    好久前写的游戏链接
    3fcfc7ca-f24a-4f35-bf5a-94a85ac909ee-image.png 那时候还不知道可以托管到Github上,好哥哥饶了我吧…
    最近描的图:链接
    // 建议出国访问



  • 很强(确信)



  • 正文那些不懂 但看tag就知道是上道的 www



  • @脚夫 全文只有tag是有价值的(


  • 管理员

    小游戏suki!不错的剧场 剧情还是有起伏的呢



更多本版内容

友情链接

中文InmWiki 中文饼Wiki InmTieba 例区Discord afdian “bilibili” TIS v2mm | 自由职业者社区