吴伟贤のBlog

Feed Rss

36选7 总8位数 求和后 取得和的集合

05.11.2013, C++, by .

C++忘得差不多,刚好一朋友需要这个小东西网上找了下简单方法,小修改了下.用win32控制台实现


// 36选7 总8位数 求和后 取得和的集合
//

#include "stdafx.h"
#include
#include
using namespace std;
const int m = 36;//数字间隔如1-15
const int n = 8; //几个数相加
bool print(int, int, int *, int *,int);
ofstream FileOpen;
struct { int no1;int no2;int no3;int no4;int no5;int no6;int no7;int no8;}date;

int main(int argc, char* argv[])
{
cout<<"请输入8个数字,\n每个数字后按回车,\n计算结果保存在目录'abc.txt':\n\n";
cout<<"第1位:"; cin>>date.no1;
cout<<"第2位:"; cin>>date.no2;
cout<<"第3位:"; cin>>date.no3;
cout<<"第4位:"; cin>>date.no4;
cout<<"第5位:"; cin>>date.no5;
cout<<"第6位:"; cin>>date.no6;
cout<<"第7位:"; cin>>date.no7;
cout<<"第8位:"; cin>>date.no8;
cout<<"生成中,请稍候!\n不要手动关闭窗口,系统会自动关闭窗口\n";
int total = date.no1+date.no2+date.no3+date.no4+date.no5+date.no6+date.no7+date.no8;
//cout<<total;
//*
FileOpen.open("abc.txt");
int *s = new int[m];
for(int i = 0; i < m; i++)
s[i] = i + 1; //初始化1-15
int *rhs = new int[n];
for(int j = 0; j < n; j++)
rhs[j] = s[j]; //提取前5个元素
FileOpen << "您输入的数" << "\n--------------------------------------------\n";
FileOpen << date.no1 << "\t" << date.no2 << "\t" << date.no3 << "\t" << date.no4 << "\t" << date.no5 << "\t" << date.no6 << "\t" << date.no7 << "\t" << date.no8 << "\n\n";
FileOpen << "生成的结果,包含输入的数" << "\n--------------------------------------------";
FileOpen << endl;
while(print(m, n, rhs, s,total));
delete rhs, s;
FileOpen.close();
cout<<"\n生成成功.请查看目录下的'abc.txt'\n";
//*/
return 0;
}
bool print(int m, int n, int *rhs, int *res, int total_sum)
{
int flag = 0;
int sum = 0;
for(int i = 0; i < n; i++)
sum += rhs[i]; //计算前5项和是否为42
if(sum == total_sum)
{
///////////////输出/////////////////
for(int i = 0; i < n; i++)
FileOpen << rhs[i] << '\t';
FileOpen << endl;
}
for(int k = 0; k < n; k++)
if(rhs[k] == res[m - (n - k)])
///////////////////////////////////
//当有第K位元素到他理论上最后的位置
//如:1234,提取3个元素排列,元素2的理论最大位置在初始3的位置
//////////////////////////////////
{
flag = k;
if(k == 0) //如果是最高位,表明所有组合遍历完毕,推出主函数的循环
return 0;
else
for(int y1 = 0; y1 < m; y1++) //否则将理论上第K位向后移一位,后面N-K位同理后移
if(res[y1] == rhs[k - 1])
{
rhs[k - 1] = res[y1 + 1];
break;
}
break;
}
if(flag)
{
int y2;
for(y2 = 0; y2 < m; y2++)
if(res[y2] == rhs[flag - 1])
break;
for(int l = y2 + 1; flag < n; l++, flag++)
rhs[flag] = res[l];
flag = 0;
}
else //没有到理论上的最高位则只需要将最后一个元素移位
{
for(int p = 0; p < m; p++) if(res[p] == rhs[n - 1]) { rhs[n - 1] = res[p + 1]; break; } } return 1; } /* 输入值,判断输入值是否正确 no 输入值 m 判断范围 now_n 第几位 */ bool input_is_enable(int no,int m,int now_n) { if(no>0 && no<=m){
return 1;
}
else{
cout<<"第"<<now_n<<"位不在1-"<<m<<"内,请重新输入";
return 0;
}
}

评论已关闭。