吾爱汇编论坛

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 689|回复: 11

求助:编写49个以内不规则的数字进行快速排列复式,VS2008c++代码

[复制链接]

  离线 

回归原点 发表于 2023-3-7 21:35 | 显示全部楼层 |阅读模式

本站严厉禁止求脱求破行为(包含无自我分析直接求思路),如发现此类求助主题请点击“举报”,让我们共同维护优质的学习环境!


500HB
    首先感谢有缘的师兄帮助我解决问题,本人真诚的感谢。以下是我程序软件里面的一段代码,由于改代码的算法方式在处理大数据(千万级数据量)时,
会造成软件卡死,则很长时间没有均没有数据出来,对此,我想请有缘的大师兄,帮忙重新编写一段代码,能快速的对49个数字进行排列出来,代码要求:VS2008编译器能进行识别该段代码
,原理也是比较简单:49个数字进行快速排列出来。如一下示范:


原数据:12,19,10,05,26,36,44,48,……(这样的数据有小于等于49个)以下是排列设定值7的数据处理结果

排列处理后的数据:
12,19,10,05,26,36,44,
12,19,10,05,26,36,48,
12,19,10,05,26,44,48,
12,19,10,05,36,44,48,
12,19,10,26,36,44,48,
12,19,05,26,36,44,48,
12,10,05,26,36,44,48,
19,10,05,26,36,44,48,



……………………………………
快速处理出来

如果原数据个数小于设定值,则无数据,如果原数据等于设定值则就是原本数据,如果原数据大于设定值,怎么进行循环排列出来



====================================================================================================================
原程序代码如下:(弊端是:小量数据没问题,但多些数据的时候,就会无法有数据出来)
void CBaseData::dfs(int u, int sum, int state, int n, int k, long long a[],CString &result)
{
        if(k>n)
        {
                result="";
                return;
        }
        CString number;
        CString character(',',1);
        if (sum + (n - u) < k) return;
        if (sum == k) {
                for (int i = 0; i < n; i++) {
                        if (state >> i & 1) {
                                number.Format(_T("%d"),a[i]);
                                if(a[i]>=1 && a[i]<10)
                                {
                                        number="0"+number;
                                }                               
                                result=result+number+character;
                               
                        }
                }
                result=result+"\n";
                return;
        }

        //当所有数都枚举完了的时候
        if (u == n) return;

        //表示这个数被选的情况
        dfs(u + 1, sum + 1, state | 1 << u,n,k, a,result);
        //表示这个数没有被选的情况
        dfs(u + 1, sum, state,n,k, a,result);
}
==============================================================================
诸位师兄,可以根据以上的定义名进行对照进行代码的编程算法!!!如果处理数据的速度49个数字复式7排列的速度在2分钟内,均可以,感谢!!


吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

黑刀 发表于 2023-3-7 21:52 | 显示全部楼层

[C++] 纯文本查看 复制代码
#include "stdafx.h"
#include <iostream>
using namespace std;


void quicksort(int left, int right, int *numbers) {
	int i = left, j = right;
	int pivot = numbers[(left + right) / 2];
	while (i <= j) {
		while (numbers[i] < pivot) {
			i++;
		}
		while (numbers[j] > pivot) {
			j--;
		}
		if (i <= j) {
			int tmp = numbers[i];
			numbers[i] = numbers[j];
			numbers[j] = tmp;
			i++;
			j--;
		}
	}
	if (left < j) {
		quicksort(left, j, numbers);
	}
	if (i < right) {
		quicksort(i, right, numbers);
	}
}
int main() {
	int numbers[] = { 15, 3, 27, 7, 42, 10, 33, 22, 16, 9, 38, 24, 1, 40, 32, 18, 11, 46, 21, 6, 35, 28, 17, 13, 30, 43, 25, 23, 31, 19, 14, 36, 8, 37, 2, 26, 20, 44, 29, 47, 5, 34, 4, 48, 12, 45, 39, 41 };
	quicksort(0, sizeof(numbers) / sizeof(int)-1, numbers);
	for (int i = 0; i < sizeof(numbers) / sizeof(int); i++) {
		cout << numbers[i] << " ";
	}
	system("pause");
	return 0;
}
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  在线 

ssjjdns 发表于 2023-3-7 23:07 | 显示全部楼层

本帖最后由 ssjjdns 于 2023-3-7 23:08 编辑

本人ACM银牌算法选手(小装一逼)。
这段代码的问题在于全排列
P(49,7) = 432938943360
也就是说最坏的情况下会有432938943360种排列方式。
这种情况已经超过了计算机的处理能力和内存空间
作者已经加了剪枝。肯定是不够的。
考虑从数学上优化这个算法。
有排列改为组合的方式
C(49,7) = 85900584可以在1s的时间枚举出所有可能的情况已经说明思路了,如果需要具体实现请带价格来找我写这个算法。一般人没有算法基础搞不定的。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

 楼主| 回归原点 发表于 2023-3-8 08:17 | 显示全部楼层

黑刀 发表于 2023-3-7 21:52
[mw_shl_code=cpp,true]#include "stdafx.h"
#include
using namespace std;

首先感谢师兄能热情的帮助,我不会C++代码的编程,请师兄帮忙用原来代码中的定义名单进行编写一下,,因为原代码都用到一些引用以及函数的调用,感谢!!,希望这个就是我能要的,数字均都是两位数的,排列组合有C(49,7) = 85900584组,希望能在2分钟内处理出来都可以
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

 楼主| 回归原点 发表于 2023-3-8 08:21 | 显示全部楼层

ssjjdns 发表于 2023-3-7 23:07
本人ACM银牌算法选手(小装一逼)。
这段代码的问题在于全排列
P(49,7) = 432938943360

感谢,的确如师兄所说,有C(49,7) = 85900584组,如果真的有师兄说的一秒钟能板举出来,那真的是太厉害了,真希望是实力。能在2分钟内出来,我都很感谢了,代码C++,vs2008编译器
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

售野生奥特曼 发表于 2023-3-8 08:38 | 显示全部楼层

[C++] 纯文本查看 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 生成所有的组合
void get_combinations(vector<vector<int>>& combinations, vector<int>& nums, int k, int start, vector<int>& temp) {
    if (temp.size() == k) {
        combinations.push_back(temp);
    } else {
        for (int i = start; i < nums.size(); i++) {
            temp.push_back(nums);
            get_combinations(combinations, nums, k, i + 1, temp);
            temp.pop_back();
        }
    }
}
// 生成所有的排列
void get_permutations(vector<vector<int>>& permutations, vector<int>& nums, vector<int>& temp, vector<bool>& used) {
    if (temp.size() == nums.size()) {
        permutations.push_back(temp);
    } else {
        for (int i = 0; i < nums.size(); i++) {
            if (!used) {
                temp.push_back(nums);
                used = true;
                get_permutations(permutations, nums, temp, used);
                temp.pop_back();
                used = false;
            }
        }
    }
}
// 生成所有的数字复式7排列
void get_duplex_permutations(vector<vector<int>>& duplex_permutations, vector<vector<int>>& combinations, vector<vector<int>>& permutations) {
    for (int i = 0; i < combinations.size(); i++) {
        for (int j = 0; j < permutations.size(); j++) {
            vector<int> temp;
            for (int k = 0; k < combinations.size(); k++) {
                for (int l = 0; l < permutations[j].size(); l++) {
                    temp.push_back(combinations[k] * 10 + permutations[j][l]);
                }
            }
            duplex_permutations.push_back(temp);
        }
    }
}
int main() {
    vector<int> nums;
    for (int i = 1; i <= 49; i++) {
        nums.push_back(i);
    }
    vector<vector<int>> combinations;
    for (int k = 1; k <= 7; k++) {
        vector<int> temp;
        get_combinations(combinations, nums, k, 0, temp);
    }
    vector<vector<int>> permutations;
    for (int i = 0; i < combinations.size(); i++) {
        vector<int> temp;
        vector<bool> used(combinations.size(), false);
        get_permutations(permutations, combinations, temp, used);
    }
    vector<vector<int>> duplex_permutations;
    get_duplex_permutations(duplex_permutations, combinations, permutations);
    // 输出所有的数字复式7排列
    for (int i = 0; i < duplex_permutations.size(); i++) {
        for (int j = 0; j < duplex_permutations.size(); j++) {
            cout << duplex_permutations[j] << " ";
        }
        cout << endl;
    }
    return 0;
}
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

 楼主| 回归原点 发表于 2023-3-8 09:03 | 显示全部楼层

售野生奥特曼 发表于 2023-3-8 08:38
[mw_shl_code=cpp,true]#include
#include
#include

首先感谢师兄能热情的帮助,我不会C++代码的编程,请师兄帮忙用原来代码中的定义名单进行编写一下,,因为原代码都用到一些引用以及函数的调用,感谢!!,希望这个就是我能要的,数字均都是两位数的,排列组合有C(49,7) = 85900584组,希望能在2分钟内处理出来都可以
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  在线 

暮雨烟然 发表于 2023-3-8 12:46 | 显示全部楼层

黑刀 发表于 2023-3-7 21:52
[mw_shl_code=cpp,true]#include "stdafx.h"
#include
using namespace std;

哇!递归!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

 楼主| 回归原点 发表于 2023-3-9 16:26 | 显示全部楼层

ssjjdns 发表于 2023-3-7 23:07
本人ACM银牌算法选手(小装一逼)。
这段代码的问题在于全排列
P(49,7) = 432938943360

可以的,重点是怎么弄?需要在我程序里面跑通
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM

  离线 

43551096 发表于 2023-3-9 17:21 | 显示全部楼层

[C++] 纯文本查看 复制代码
#include <iostream>
#include <vector>

using namespace std;

void backtrack(vector<int>& nums, vector<int>& path, int k, vector<vector<int>>& res) {
    if (path.size() == k) {
        res.push_back(path);
        return;
    }

    for (int i = 0; i < nums.size(); i++) {
        if (find(path.begin(), path.end(), nums[i]) != path.end()) continue;
        path.push_back(nums[i]);
        backtrack(nums, path, k, res);
        path.pop_back();
    }
}

vector<vector<int>> getPermutations(vector<int>& nums, int k) {
    vector<vector<int>> res;
    vector<int> path;
    backtrack(nums, path, k, res);
    return res;
}

int main() {
    vector<int> nums = {12,19,10,05,26,36,44,48};
    int k = 7;
    vector<vector<int>> res = getPermutations(nums, k);
    for (const auto& v : res) {
        for (int n : v) {
            cout << n << ",";
        }
        cout << endl;
    }
    return 0;
}
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编论坛(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编论坛不承担任何因为技术滥用所产生的连带责任。吾爱汇编论坛内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长微信:SharkHeng


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编论坛 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

0.081682 , 55

Powered by Discuz!

吾爱汇编论坛 www.52hb.com

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