-
bignumber.js:JavaScript库,用于任意精度的十进制和非十进制算术-源码
2021-02-03 15:35:11一个JavaScript库,用于任意精度的十进制和非十进制算术。 产品特点 整数和小数 简单的API,但功能齐全 比Java的BigDecimalJavaScript版本更快,更小,甚至更容易使用 缩小并压缩8 KB 复制JavaScript的Number类型的... -
简易状态压缩DP
2020-09-25 20:14:02康康目录位运算 位运算 左移右移 左移:左移一位,等价于该数x2 eg....<1 = 1100 (十进制从6变为12) 右移同理 eg....1 = 11(十进制从6变为3) ...当我们需要判断或修改二进制数S的第i位时,我们进行以下操作 若判断第简易状压DP
开头甩定义
借助二进制完成对状态的压缩,从而进行动态规划的过程,我们称之为状态压缩动态规划(简称“状压DP”)
位运算
-
左移右移
左移:左移一位,等价于该数x2
eg. 110<<1 = 1100 (十进制从6变为12)
右移同理
eg. 110>>1 = 11(十进制从6变为3) -
与或非
相信各位OIer应当在普及时就学过位运算了,但本蒟蒻还是要讲
与:按位进行与运算 满足两数同一位都为1时结果为1,否则为0
或:按位进行或运算 满足两数同一位都为0时结果为0,否则为1
非:按位取反 -
简单运算
当我们需要判断或修改二进制数S的第i位时,我们进行以下操作
若判断第i位是否为0 即判断 (S&(1<<i)) 是否为0
若要将第i位设置为1 即 (S|(1<<i)) 即1左移i位于S进行或运算
若要将第i位设置为0 即 (S&~(1<<i)) 即S与只有第i位为0的数进行或运算 -
简单应用
经过上面的学习大家可以发现我们可以用位运算的方法来枚举子集
假设集合A={1,2,3,4,5}
我们可以通过将A中的数编号的方式使其转化为一个二进制数
是不是非常神奇呀
下面我们来康康具体操作
假设我们要表示A的子集B={2,4,5}
二进制数位 4 3 2 1 0 二进制值 1 1 0 1 0 子集元素 5 4 0 2 0 这里需要注意的是二进制的数位是从0开始的,所以对应关系不要找错
所以B集合用二进制就可以表示为11010啦!!那么我们来做个练习
李白打酒 【2014蓝桥杯预赛】
话说大诗人李白,一生好饮。
一天,他提着酒壶,从家里出来,酒壶中有酒两斗。他边走边唱:
无事街上走,提壶去打酒
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。请你计算李白有多少种满足要求的遇到店和花的可能情况
输入
无
正确输出
14题解:
一道简单的练手题
考虑使用01串表示遇到花或者店,因为最后一个一定是花所以枚举14位01串就OK
代码放送~#include <bits/stdc++.h> using namespace std; int main() { int ans=0; for(int i=0;i<(1<<14);i++)//枚举每种情况 { int ans1=0,ans2=0; int num=2; for(int j=0;j<14;j++) { if(i&(1<<j)) { ans1++; num*=2; } else {ans2++;num--;} } if(ans1==5&&ans2==9&&num==1)ans++;//特判 } cout<<ans; }
好的你已经掌握了基本的位运算知识了让我们来康康
简单状压DP状压DP
话不多说直接上题
国王 [SGU 223]
在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8 个格子,求使它们无法互相攻击的方案总数
输入
只有一行,包含两个整数 n 和 k输出
每组数据一行为方案总数,若不能够放置则输出 0样例输入
3 2
样例输出
161<=n<=10 , k<=n2
题解
本题为状态压缩DP入门题
这个题使用八皇后做法是显然不行的(很难剪枝),就考虑使用DP,然而国王在棋盘上的状态使用传统的f[i][j]很难表示,由于国王的状态只有两种,放置与不放置,所以考虑状压解决
对于第i行所摆放的国王,只会有第i-1行和第i+1行的国王影响它,对其的影响是i-1行和i+1行的摆放方式和1~i-1行总共摆放的国王数很容易得出初始的动态方程
令f[i][j][s]为第i行目前摆放状态a[j]和前i行已经摆放的国王个数s,易得
f[i][j][s]=∑f[i-1][k][t]
a[j],a[k]为两种不同摆放方式
那么接下来我们就要想想如何表示这两种状态
还记得我们之前说的李白问题吗?不记得就回去看
看见国王在棋盘上摆放的状态只有两种,摆与不摆,那么我们可以尝试使用一个01串表示状态,又因为一排最多10个格子,最大宽度也满足,考虑:
(蒟蒻表格,@代替下国王,没有就是x)@ x x x @ x 1 0 0 0 1 0 如上图,每个格子对应一个二进制位,于是乎状态就可以用一个
卡哇伊的二进制数表示出来啦
时间复杂度也是允许的,可以自己推推看~
放代码!!#include<bits/stdc++.h> //万能库深得朕心 using namespace std; typedef long long ll; #define N 15 ll f[N][155][155],ans=0,s=0; int n,sum[166],num[155],K; int main() { cin>>n>>K; memset(f,0,sizeof(f)); for(int i=0;i<(1<<n);i++) { if(i&(i<<1)) continue; //检查状态 int k=0; for(int j=0;j<n;j++) if(i&(1<<j))k++; sum[++s]=i; num[s]=k; } f[0][1][0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=s;j++) for(int k=0;k<=K;k++) { if(k>=num[j]) for(int t=1;t<=s;t++) if(!(sum[t]&sum[j])&&!(sum[t]&(sum[j]<<1))&&!(sum[t]&(sum[j]>>1))) f[i][j][k]+=f[i-1][t][k-num[j]]; } for(int i=1;i<=s;i++) ans+=f[n][i][K]; //统计 cout<<ans<<endl; }
是不是有点感觉了
还要多练练题,基础的思路就是判断状态是否可以转化为二进制,推导dp方程然后写就完事
PS:位运算一定要好好记:)(惨痛教训) -
-
8421BCD码运算法则,超过9(不含)或者有进位,需要加6补偿
2020-01-15 10:39:56附注:压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001...附注:压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8.
BCD码的运算法则
BCD码的运算规则:BCD码是十进制数,而运算器对数据做加减运算时,都是按二进制运算规则进行处理的。这样,当将 BCD码传送给运算器进行运算时,其结果需要修正。修正的规则是:当两个BCD码相加,如果和等于或小于 1001(即十进制数9),不需要修正;如果相加之和在 1010 到1111(即十六进制数 0AH~0FH)之间,则需加 6 进行修正;如果相加时,本位产生了进位(十六制进位2020.1.15),也需加 6 进行修正。这样做的原因是,机器按二进制相加,所以 4 位二进制数相加时,是按“逢十六进一”的原则进行运算的,而实质上是 2 个十进制数相加,应该按“逢十进一”的原则相加,16 与10相差 6,所以当和超过 9或有进位时,都要加 6 进行修正。下面举例说明。
【例 1.3】 需要修正 BCD码运算值的举例。
(1) 计算 5+8;(2) 计算 8+8
解:(1) 将 5 和 8 以 8421 BCD输入机器,则运算如下:
0 1 0 1
+) 1 0 0 0
1 1 0 1 结果大于 9
+) 0 1 1 0 加 6 修正
1 0 0 1 1 即13 的 BCD码
结果是 0011,即十进制数3,还产生了进位。5+8=13,结论正确。
(2)将8以8421 BCD输入机器,则运算如下:
1 0 0 0
+)1 0 0 0
1 0 0 0 0产生进位 (十六制进位,2020.1.15)
+)0 1 1 0 加6修正
1 0 1 1 0 16的BCD码
结果是0110,即十进制的6,而且产生进位。8+8=16,结论正确。
微机原理代码: (AL=BCD 5,BL=BCD 8) 设AH=0,则
ADD AL,BL
AAA
结果为 AX=0103H,表示非压缩十进制数,CF=1,AF=1,AH=1,AL=3
使用AAA指令,可以不用屏蔽高半字节,只要在相加后立即执行AAA指令,便能在AX中得到一个正确的非压缩十进制数
-
BCD码
2017-07-26 17:39:35压缩BCD码用4位2进制表示,1字节表示2位BCD码如10010011B表示十进制数93非压缩BCD码用1字节表示 BCD码是一一对应的,如:十进制的123 用BCD表示为:0001 0010 0011因为:十进制的 1 用二进制表示是 0001十进制的...压缩BCD码用4位2进制表示,1字节表示2位BCD码
如10010011B表示十进制数93
非压缩BCD码用1字节表示
BCD码是一一对应的,如:十进制的123 用BCD表示为:0001 0010 0011因为:十进制的 1 用二进制表示是 0001十进制的 2 用二进制表示是 0010十进制的 3 用二进制表示是 0011与二进制的区别:123的二进制应该用短除法求得1111011由此可见,BCD码只是机械地用二进制表示十进制的每一位。压缩与非压缩:由于1字节有8bit(8个0或1)如果用一字节存储4位BCD码(其余补0)就是非压缩如 十进制的123:00000001 00000010 0011如果用一字节存储8位BCD码就是压缩如 十进制的123:0001 0010 00114位BCD码 8421 8位BCD码 8421 8421
C语言压缩bcd码
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- /*
- * 字符串转成bcd码,这个是正好偶数个数据的时候,如果是奇数个数据则分左靠还是右靠压缩BCD码
- */
- int asc_to_bcd(char * dest,const char *src)
- {
- unsigned char temp;
- while(*src !='\0')
- {
- temp = *src;
- *dest |= ((temp&0xf)<<4);
- src++;
- temp = *src;
- *dest |= (temp&0xf);
- src++;
- dest++;
- }
- return 0;
- }
- int asc_to_bcd_right(char *dest,const char *src,int src_len)
- {
- unsigned char temp;
- if((src_len %2) !=0)
- {
- *dest &= 0;
- temp = *src;
- *dest |= (temp&0xf);
- src++;
- dest++;
- }
- asc_to_bcd(dest,src);
- return 0;
- }
- int asc_to_bcd_left(char *dest,const char *src,int src_len)
- {
- unsigned char temp;
- if((src_len %2) !=0)
- {
- dest[src_len-1] &=0;
- }
- asc_to_bcd(dest,src);
- return 0;
- }
- void print_hex(char * bcd,int len)
- {
- int i=0;
- for(i=0;i<len;i++)
- {
- int n = 8;
- while(n--){
- if((bcd[i] & (0x1<<n))==0)
- printf("0");
- else
- printf("1");
- }
- putchar('\n');
- }
- }
- int bcd_to_asc(char *dest,const char *src,int src_len)
- {
- unsigned char temp;
- char *t = dest;
- while(src_len--)
- {
- *t |= ((*src&0xf0)>>4);
- *t++ |= 0x30;
- *t |= (*src&0xf);
- *t++ |= 0x30;
- src++;
- }
- return 0;
- }
- int left_bcd_to_asc(char *dest,const char * src,int src_len)
- {
- bcd_to_asc(dest,src,src_len);
- dest[src_len*2 -1] = '\0';
- return 0;
- }
- int right_bcd_to_asc(char *dest,const char * src,int src_len)
- {
- bcd_to_asc(dest,src,src_len);
- memmove(dest,dest+1,src_len*2-1);
- dest[src_len*2-1] = '\0';
- return 0;
- }
- int main(void)
- {
- char str[100];
- char *str1 = "1234567";
- int str_len = strlen(str1);
- int bcd_len = (str_len+1)/2;
- char *bcd = (char *)malloc(bcd_len);
- printf("str_len = %d \n",str_len);
- printf("bcd_len = %d \n",bcd_len);
- memset(bcd,0,bcd_len);
- memset(str,0,100);
- #if 0
- printf("右靠\n");
- asc_to_bcd_right(bcd,str1,str_len);
- print_hex(bcd,bcd_len);
- right_bcd_to_asc(str,bcd,bcd_len);
- printf("str = %s\n",str);
- #endif
- #if 1
- printf("左靠\n");
- asc_to_bcd_left(bcd,str1,str_len);
- print_hex(bcd,bcd_len);
- //memset(str,0,100);
- left_bcd_to_asc(str,bcd,bcd_len);
- printf("str = %s\n",str);
- #endif
- return 0;
- }
-
BCD
2014-05-20 11:54:57压缩BCD码用4位2进制表示,1字节表示2位BCD码如10010011B表示十进制数93非压缩BCD码用1字节表示BCD码是一一对应的,如:十进制的123 用BCD表示为:0001 0010 0011因为:十进制的 1 用二进制表示是 0001十进制的 2 用二...压缩BCD码用4位2进制表示,1字节表示2位BCD码
如10010011B表示十进制数93
非压缩BCD码用1字节表示
BCD码是一一对应的,如:十进制的123 用BCD表示为:0001 0010 0011因为:十进制的 1 用二进制表示是 0001十进制的 2 用二进制表示是 0010十进制的 3 用二进制表示是 0011与二进制的区别:123的二进制应该用短除法求得1111011由此可见,BCD码只是机械地用二进制表示十进制的每一位。压缩与非压缩:由于1字节有8bit(8个0或1)如果用一字节存储4位BCD码(其余补0)就是非压缩如 十进制的123:00000001 00000010 0011如果用一字节存储8位BCD码就是压缩如 十进制的123:0001 0010 00114位BCD码 8421 8位BCD码 8421 8421
C语言压缩bcd码
#include <stdio.h> #include <stdlib.h> #include <string.h> /* * 字符串转成bcd码,这个是正好偶数个数据的时候,如果是奇数个数据则分左靠还是右靠压缩BCD码 */ int asc_to_bcd(char * dest,const char *src) { unsigned char temp; while(*src !='\0') { temp = *src; *dest |= ((temp&0xf)<<4); src++; temp = *src; *dest |= (temp&0xf); src++; dest++; } return 0; } int asc_to_bcd_right(char *dest,const char *src,int src_len) { unsigned char temp; if((src_len %2) !=0) { *dest &= 0; temp = *src; *dest |= (temp&0xf); src++; dest++; } asc_to_bcd(dest,src); return 0; } int asc_to_bcd_left(char *dest,const char *src,int src_len) { unsigned char temp; if((src_len %2) !=0) { dest[src_len-1] &=0; } asc_to_bcd(dest,src); return 0; } void print_hex(char * bcd,int len) { int i=0; for(i=0;i<len;i++) { int n = 8; while(n--){ if((bcd[i] & (0x1<<n))==0) printf("0"); else printf("1"); } putchar('\n'); } } int bcd_to_asc(char *dest,const char *src,int src_len) { unsigned char temp; char *t = dest; while(src_len--) { *t |= ((*src&0xf0)>>4); *t++ |= 0x30; *t |= (*src&0xf); *t++ |= 0x30; src++; } return 0; } int left_bcd_to_asc(char *dest,const char * src,int src_len) { bcd_to_asc(dest,src,src_len); dest[src_len*2 -1] = '\0'; return 0; } int right_bcd_to_asc(char *dest,const char * src,int src_len) { bcd_to_asc(dest,src,src_len); memmove(dest,dest+1,src_len*2-1); dest[src_len*2-1] = '\0'; return 0; } int main(void) { char str[100]; char *str1 = "1234567"; int str_len = strlen(str1); int bcd_len = (str_len+1)/2; char *bcd = (char *)malloc(bcd_len); printf("str_len = %d \n",str_len); printf("bcd_len = %d \n",bcd_len); memset(bcd,0,bcd_len); memset(str,0,100); #if 0 printf("右靠\n"); asc_to_bcd_right(bcd,str1,str_len); print_hex(bcd,bcd_len); right_bcd_to_asc(str,bcd,bcd_len); printf("str = %s\n",str); #endif #if 1 printf("左靠\n"); asc_to_bcd_left(bcd,str1,str_len); print_hex(bcd,bcd_len); //memset(str,0,100); left_bcd_to_asc(str,bcd,bcd_len); printf("str = %s\n",str); #endif return 0; }
-
北京工业大学 微机原理与接口技术 实验九 数码转换
2015-02-23 23:51:49十六进制数转换为十进制数 习题2.十进制数转换为七段码 再次重申,上面三个代码不包含在本资源中。 本代码仅供个人学习参考使用,请勿自行在其他网站及论坛发布,作者在此对访问本资源的同学表示感谢。尽管作者对... -
计算机数据表示
2020-02-20 13:18:31目录1.数制及其转换1.1常用数制1.2数制之间的转换(1)十进制转其他进制(2)其他进制转十进制(3)2,8,16进制的转换2.计算机中的数值编码2.1原码,反码,补码2.2原码与补码的...(1)十进制数(Decimal):人类习... -
微机原理与接口技术之指令
2018-03-30 18:14:23【3-39】以MEM为首地址的内存区域中有10个以非压缩的BCD码形式存放的十进制数,他们的值可能是0~9中的任意一个,现编程序将这10个数顺序显示在屏幕上: 程序代码如下: LEA SI , MEM ;将MEM的16位偏移地址送到SI... -
微型计算机原理与接口技术
2018-04-01 19:27:201、3-39:以MEM为首地址的内存区域中10个以非压缩性BCD码形式存放的十进制数,它的可能值0-9中任意一个数字,先编程将这10个数顺序显示在屏幕上,程序段如下:LEA SI,MEM ;SI—源串偏移地址MOV CX,10 ;设置串... -
(三)逻辑运算指令和串操作指令
2015-12-16 11:12:39逻辑运算指令 运算规则: 按位操作,无进位、借位 (1)逻辑“与”AND 对两个操作数进行按位逻辑“与”操作 格式:AND dest,src ...把AL中的非压缩BCD码变成相应十进制数的ASCII码。 OR AL, 30H -
-
TCP/IP技术大全(中文PDF非扫描版)
2015-08-12 14:56:234.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ... -
疯狂的程序员
2012-07-18 18:05:32想我那个年代,这城市有多少程序员,数都能数出来。我还报了高程,唉……差一点。” 能去教书当然好,因为去教书才有可能从学校里泡个妹妹出来,才有可能和他一样牛B。这么想着,绝影说:“我也想做程序员。” “你... -
算法引论:一种创造性方法.[美]Udi Manber(带详细书签).pdf
2018-04-23 00:31:292.12 循环不变量:将十进制数转换为二进制数 2.13 常见的错误 2.14 小结 第3章 算法分析 3.1 引言 3.2 符号O 3.3 时间与空间复杂度 3.4 求和 3.5 递推关系 3.5.1 巧妙地猜测 3.5.2 分治关系 3.5.3 涉及... -
SQL Server 2008实战(SQL Server程序员和DBA不可或缺的权威参考手册)--详细书签版
2013-02-06 11:52:19除本书外,他撰写的SQL Server 2000 Fast Answers for DBAs and Developers(即本书前身)是Amazon五星著作,与人合写的Pro SQL Server 2005也广受好评。他的博客地址是http://joesack.com/WordPress/。 目录 封面 ... -
网管教程 从入门到精通软件篇.txt
2010-04-25 22:43:49JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形... -
8086寻址方式及指令系统
2013-01-14 15:52:17第三章 8086/8088的寻址方式和指令系统 练习题 一.单项选择题 1.设BX=2000H,SI=3000H,指令MOV AX,[BX+SI+8]的源操作有效地址为( )。 A.5000H B.5008H C.23008H D....22.十进制数1234的压缩型BCD码为 。... -
易语言 茶凉专用模块
2010-05-04 12:26:36子程序 到十进制, 整数型, 公开, 将2,8,16进制文件转换到10进制数值(返回十进制数) .参数 文本, 文本型, , 2,8,16进制文件 .参数 进制, 整数型, 可空, 默认为十六进制 2为二进制,8为八进制,16为16进制 .子程序 读... -
-
ewb multisim 仿真实例电路图全集
2015-10-21 09:19:01│ │ 2-4 与非逻辑.ms9 │ │ 2-5 或非逻辑.ms9 │ │ 2-6 与或非逻辑.ms9 │ │ 2-7 异或逻辑.ms9 │ │ 2-8 逻辑函数的转换(1).ms9 │ │ 2-9 逻辑函数的转换(2).ms9 │ │ │ ├─SD02 │ │ 2-10 二极管... -
C#开发实战1200例(第1卷).(清华出版.王小科.王军.扫描版).part1
2016-06-16 20:55:43实例110 通过定义方法求一个数的平方 实例111 使用重载方法实现不同类型数据的计算 5.2 结构与类 实例112 通过结构计算矩形的面积 实例113 通过类继承计算梯形面积 实例114 封装类实现一个简单的计算器 实例... -
C#开发实战1200例(第1卷).(清华出版.王小科.王军.扫描版).part2
2016-06-16 20:59:52实例110 通过定义方法求一个数的平方 实例111 使用重载方法实现不同类型数据的计算 5.2 结构与类 实例112 通过结构计算矩形的面积 实例113 通过类继承计算梯形面积 实例114 封装类实现一个简单的计算器 实例... -
C#开发实战1200例(第1卷).(清华出版.王小科.王军.扫描版).part3
2016-06-16 21:02:21实例110 通过定义方法求一个数的平方 实例111 使用重载方法实现不同类型数据的计算 5.2 结构与类 实例112 通过结构计算矩形的面积 实例113 通过类继承计算梯形面积 实例114 封装类实现一个简单的计算器 实例... -
C#开发实战1200例(第一卷+第二卷)+源码下载地址.txt
2019-05-17 09:24:24主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象...压缩文件、C#与Word互操作、高效应用Excel、基本图形绘制、图像处理技术、常用图表应用、动画处理技术、音频与视频控制... -
C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载
2018-02-20 01:26:55主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象...压缩文件、C#与Word互操作、高效应用Excel、基本图形绘制、图像处理技术、常用图表应用、动画处理技术、音频与视频控制... -
MATLAB通信仿真及应用实例详解(附超星阅读器)
2018-09-05 17:07:506.2.4 实例6.1--A律十三折与μ律十五折的量化误差 159 6.3 差分编码 162 6.3.1 差分编码器 162 6.3.2 差分解码器 163 6.4 DPCM编码和解码 164 6.4.1 DPCM编码器 164 6.4.2 DPCM解码器 166 6.4.3 实例6.2--DPCM与PCM... -
Linux操作系统基础教程
2013-04-08 21:34:26Linux 是在 1991 年发展起来的与 UNIX兼容的操作系统,可以免费使用,它的源代码 可以自由传播且可任人修改、充实、发展,开发者的初衷是要共同创造一个完美、理想并 可以免费使用的操作系统。 我们并不能使同学... -
JAVA上百实例源码以及开源项目源代码
2018-12-11 17:07:42Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、... -
JAVA上百实例源码以及开源项目
2016-01-03 17:37:40Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...