- 问题描述
将2n个0和2n 个1,排成一圈。从任一个位置开始,每次按逆时针的方向以长度为n+1的单位进行数二进制数。
要求给出一种排法,用上面的方法产生出来的2n+1个二进制数都不相同。
例如,当n=2时, 即22个0 和22个1 排成如下一圈:
比如,从A位置开始,逆时针方向取三个数000,然后再从B位置上开始取三个数001,接着从C开始取三个数010,…,可以得到000,001,010,101,011,111,110,100共8个二进制数且都不相同。
程序说明
以n=4为例,即有16个0,16个1,
数组a用以记录32个0,1的排法,
数组b统计二进制数是否已出现过。
程序清单
/* 完善程序 第3节 提高篇 1、[NOIP2000] 1.问题描述 将2n个0和2n 个1,排成一圈。从任一个位置开始, 每次按逆时针的方向以长度为n+1的单位进行数二进制数。 要求给出一种排法,用上面的方法产生出来的2n+1个二进制数都不相同。 例如,当n=2时, 即22个0 和22个1 排成如下一圈: 比如,从A位置开始,逆时针方向取三个数000, 然后再从B位置上开始取三个数001, 接着从C开始取三个数010,…, 可以得到000,001,010,101,011,111,110,100 共8个二进制数且都不相同。 程序说明 以n=4为例,即有16个0,16个1, 数组a用以记录32个0,1的排法, 数组b统计二进制数是否已出现过。 程序清单 */ #include <iostream> #include <cstdio> #include <cmath> using namespace std; int a[37],b[32],i,j,k,s,p; int main( ) { for(i=1;i<=36;i++) a[i]=0; for(i=28;i<=32;i++) a[i]=1; p=1;a[6]=1; while(p==1) { j=27; while(a[j]==1) j--; ____; for(i=j+1;i<=27;i++) _____; for(i=0;i<=31;i++) b[i]=0; for(i=1;i<=32;i++) { _______; for(k=i;k<=i+4;k++) s=s*2+a[k]; _______; } s=0; for(i=0;i<=31;i++) s+=b[i]; if ______ p=0; } for(i=1;i<=32;i++) for(j=i;j<=i+4;j++) cout<<a[j]; cout<<endl; return 0; }
0.CSP-J初赛集训第0课——进制转换
1.CSP-J初赛集训第1课——计算机中的数据大小
2.CSP-J初赛集训第2课 原码反码与补码
3.CSP-J初赛集训第3课 进制转换 原码反码补码 近十年真题汇总
4.CSP-J初赛集训第4课——栈和队列初识
5.CSP-J初赛集训—栈的近20年真题讲解
6.CSP-J初赛集训——循环队列 真题讲解
7.CSP-J初赛集训第5课 数据结构 树的基本概念介绍 树和二叉树 小白一听就会
8.CSP-J初赛集训 关于树的计算真题 二叉树的计算 CSP noip
9.CSP-J初赛集训第6课 二叉树的遍历 小白入门必好学
10.CSP-J初赛集训 二叉树的遍历 历年真题讲解
11.CSP-J初赛集训第6课 图的基本概念介绍
12.CSP-J初赛集训 关于图的历年真题讲解
13.CSP-J初赛集训第7课_排列和组合