// MathOR.cpp : 定义控制台应用程序的入口点。//
#include "stdafx.h"#include <vector>#include <math.h>#include <cstdlib>#include <fstream>#include <iostream>
using namespace std;#define M 15#define N 15#define Q (1+(N-1)/8)struct row{ char data[Q];};vector<row> v,v1,v2;//v是初始矩阵,v1是奇数操作后的矩阵,v2是偶数操作后的矩阵//随机生成矩阵vvoid Random();//比较两个row是否相同bool IsSame(row r1,row r2);//将给定的行进行或操作生成新行void GenRow(int s[]);//计算void Compute(int s[],int n);//输出矩阵到指定流void Output(vector<row> v,ostream& out);
int _tmain(int argc, _TCHAR* argv[]){ ofstream outv,outv1,outv2; outv.open("c:\\v.txt"); outv1.open("c:\\v1.txt"); outv2.open("c:\\v2.txt");
Random();
if(outv.is_open()) { Output(v,outv); }
int s[M]={}; Compute(s,0); if(outv1.is_open()) { Output(v1,outv1); } if(outv2.is_open()) { Output(v2,outv2); }
cout<<"l=1共"<<v1.size()<<"条"<<endl; cout<<"l=-1共"<<v2.size()<<"条"<<endl;
system("pause"); return 0;}
row RandRow(){ row r; for(int j=0;j<Q-1;j++) { r.data[j]=rand()%256; } switch(Q*8-N) { case 0: { r.data[Q-1]=rand()%256; break; } case 1: { r.data[Q-1]=(rand()%256)&0xfe; break; } case 2: { r.data[Q-1]=(rand()%256)&0xfc; break; } case 3: { r.data[Q-1]=(rand()%256)&0xf8; break; } case 4: { r.data[Q-1]=(rand()%256)&0xf0; break; } case 5: { r.data[Q-1]=(rand()%256)&0xe0; break; } case 6: { r.data[Q-1]=(rand()%256)&0xc0; break; } case 7: { r.data[Q-1]=(rand()%256)&0x80; break; } } return r;}void Random(){ for(int i=0;i<M;i++) { bool same=false; row r; do { same=false; r=RandRow(); for(int j=0;j<v.size();j++) { if(IsSame(r,v[j])) { same=true; break; } } }while(same); v.push_back(r); }}
bool IsSame(row r1,row r2){ char s=0x00; for(int i=0;i<Q;i++) { s=s|(r1.data[i]^r2.data[i]); if(s) { return false; } } return true;}void GenRow(int s[]){ row r={0}; int count=0;//判断有多少个1,从而决定是偶数操作还是奇数操作 for(int i=0;i<M;i++) { if(s[i]==1) { for(int j=0;j<Q;j++) { r.data[j]|=v[i].data[j]; } count++; } } if(count==0) { return; } if(count%2==0) {//偶数操作,使用v2 for(int i=0;i<v2.size();i++) { if(IsSame(r,v2[i])) { return; } } v2.push_back(r); return; } else {//奇数操作,使用v1 for(int i=0;i<v1.size();i++) { if(IsSame(r,v1[i])) { return; } } v1.push_back(r); return; }}void Compute(int s[],int n){ if(n>=M) { row r; GenRow(s); } else { s[n]=0; Compute(s,n+1); s[n]=1; Compute(s,n+1); }}int convert(char d,char z){ if(!(d&z)) { return 0; } else { return 1; }}char T[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};void Output(vector<row> v,ostream& out){ for(int i=0;i<v.size();i++) { for(int j=0;j<Q-1;j++) { for(int k=0;k<8;k++) { out<<convert(v[i].data[j],T[k])<<" ";//取第k位 } } for(int k=0;k<N-(Q-1)*8;k++) { out<<convert(v[i].data[Q-1],T[k])<<" ";//取第k位 } out<<endl; }}
帮忙看一下这个程序中compute函数是怎么运行的。s【】这个数组怎么产生的啊
答案:1 悬赏:0 手机版
解决时间 2021-05-10 09:53
- 提问者网友:愿为果
- 2021-05-10 05:53
最佳答案
- 五星知识达人网友:天凉才是好个秋
- 2021-05-10 06:28
COMPUTE 生成的结果集COMPUTE 所生成的汇总值在查询结果中显示为分离的结果集。包括 COMPUTE 子句的查询的结果类似于控制中断报表,即汇总值由指定的组(或称中断)控制的报表。可以为各组生成汇总值,也可以对同一组计算多个聚合函数。当 COMPUTE 带有可选的 BY 子句时,符合 SELECt 条件的每个组都有两个结果集: 每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。 当 COMPUTE 不带可选的 BY 子句时,SELECT 语句有两个结果集: 每个组的第一个结果集是包含选择列表信息的所有明细行。第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。 COMPUTE 用法示例下列 SELECT 语句使用简单 COMPUTE 子句生成 titles 表中 price 及 advance 的求和总计:USE pubsSELECT type, price, advanceFROM titlesORDER BY typeCOMPUTE SUM(price), SUM(advance)下列查询在 COMPUTE 子句中加入可选的 BY 关键字,以生成每个组的小计:USE pubsSELECt type, price, advanceFROM titlesORDER BY typeCOMPUTE SUM(price), SUM(advance) BY type此 SELECt 语句的结果用 12 个结果集返回,六个组中的每个组都有两个结果集。每个组的第一个结果集是一个行集,其中包含选择列表中所请求的信息。每个组的第二个结果集包含 COMPUTE 子句中两个 SUM 函数的小计。说明 一些实用工具(如 osql)显示多个小计或合计聚合汇总的方式可能会使用户以为每个小计都是结果集中的单独一行。这是由于该实用工具设置输出格式的方式;小计或合计聚合返回时单独占用一行。其它应用程序(如 SQL 查询分析器)将多个聚合设置在同一行。比较 COMPUTE 和 GROUP BYCOMPUTE 和 GROUP BY 之间的区别汇总如下: GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。COMPUTE 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 SELECT 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中。 下列查询使用 GROUP BY 和聚合函数;该查询将返回一个结果集,其中每个组有一行,该行中包含该组的聚合小计:USE pubsSELECT type, SUM(price), SUM(advance)FROM titlesGROUP BY type说明 在 COMPUTE 或 COMPUTE BY 子句中,不能包含 ntext、text 或 image 数据类型。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯