编程实现表1(L的输入-输出模式分布),证实表1的正确性
来源:互联网 发布:寻侠兵书突破数据 编辑:程序博客网 时间:2024/06/05 11:17
public class Main4 { //定义输入字的长度,根据题意,长度为8,也就是用8个16进制的数来表示一个字 public static int WORD_STRING_LENGTH=8; //一个字占32bit,用32位二进制数来表示 public static int BIT_LIST_LENGTH=4*WORD_STRING_LENGTH; //定义二进制与十进制对应的数组 public static int PATTERN_LENGTH=16; public static String[] bitList={ "0000","0001","0010","0011", "0100","0101","0110","0111", "1000","1001","1010","1011", "1100","1101","1110","1111"}; public static String hexList="0123456789abcdef"; public static void main(String[] args) { System.out.println("运行时间达七小时,请耐心等候…………"); String [][] distribution=new String [PATTERN_LENGTH][PATTERN_LENGTH]; distribution=getDistribution(PATTERN_LENGTH); printResult(distribution); } /* 该方法实现线性变换模块。要求:用户输入一个用16进制表示的数字(例如 1a2b3c4d) 程序输出相应的用16进制表示的字 */ private static String getResult(String str){ int[] B=new int[BIT_LIST_LENGTH];//用于存储输入字转为二进制的数 int[] LB=new int[BIT_LIST_LENGTH];//用于存储得到的二进制结果 String LB_16="";//用于存储得到的十六进制结果 //进行一次循环,将输入的十六进制的数转化为二进制的数 for(int i=0;i<WORD_STRING_LENGTH;i++){ int k=Integer.valueOf(str.substring(i,i+1),16); for(int j=0;j<4;j++){ B[4*i+j]=bitList[k].charAt(j)-48; } } //进行线性变换操作 for(int p=0;p<BIT_LIST_LENGTH;p++){ LB[p]=B[p]^ B[(p+2)%BIT_LIST_LENGTH]^ B[(p+10)%BIT_LIST_LENGTH]^ B[(p+18)%BIT_LIST_LENGTH]^ B[(p+24)%BIT_LIST_LENGTH]; } //将二进制的数转换为十六进制的数 for(int x=0;x<WORD_STRING_LENGTH;x++){ String temp=""; for(int y=0;y<4;y++){ temp+=LB[x*4+y]; } LB_16+=Integer.toHexString(Integer.parseInt(temp, 2)); } return LB_16; } /* 输入两个十进制的数,返回两个十六进制的数组成的字符串 */ private static String getTwoHex(int i,int j){ String str= hexList.substring(i,i+1)+hexList.substring(j,j+1); return str; } /* 定义了模式函数,输入的是一个字,四个字节,八个十六进制的数, 每两个十六进制的数为一个字节,如果两个字节的数都为0,则该字节为零 对输入的四个字节进行判断,如果该字节为0则用一个0定义该字节, 如果该字节不为0,则用1定义该字节 例如输入:00001a2b ,则输出为:0011 */ private static String pattern(String str){ String pat=""; for (int i=0;i<str.length()/2;i++){ if(str.substring(2*i,2*(i+1)).equals("00")|| str.substring(2*i,2*(i+1))=="00"){ pat+="0"; } else { pat+="1"; } } return pat; } private static String[][] getDistribution(int n){ long sum[]=new long[n+1]; long count[][]=new long[n+1][n+1]; String result[][]=new String [n+1][n+1]; //对每一种情况进行操作,操作时候可以将情况分为4类 for(int x=1;x<n;x++){ int item=getItem(x); switch (item){ case 1://只包含一个1的情况 for (int i = 0; i <16; i++) { for (int j = 0; j < 16; j++) { if (!(i == 0 && j == 0)){ sum[x]++; String twoHex1 = getTwoHex(i, j); String str= "000000" + twoHex1; String pat=pattern(getResult(str)); int index=Integer.parseInt(pat, 2); count[x][index]++; } } } break; case 2://包含两个1的情况 for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { for (int k = 0; k < 16; k++) { for (int l = 0; l < 16; l++) { if (!((i == 0 && j == 0) || (l == 0 && k == 0) )) { sum[x]++; String twoHex1 = getTwoHex(i, j); String twoHex2 = getTwoHex(k, l); String str = "0000" + twoHex1 + twoHex2; String pat = pattern(getResult(str)); int index = Integer.parseInt(pat, 2); count[x][index]++; } } } } } break; case 3://包含三个1的情况 for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { for (int k = 0; k < 16; k++) { for (int l = 0; l < 16; l++) { for (int a = 0; a < 16; a++) { for (int b = 0; b < 16; b++) { if (!((i == 0 && j == 0) || (l == 0 && k == 0) || (a == 0 && b == 0))) { sum[x]++; String twoHex1 = getTwoHex(i, j); String twoHex2 = getTwoHex(k, l); String twoHex3 = getTwoHex(a, b); String str = "00" + twoHex1 + twoHex2 + twoHex3; String pat=pattern(getResult(str)); int index=Integer.parseInt(pat, 2); count[x][index]++; } } } } } } } break; case 4://包含四个1的情况 for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { for (int k = 0; k < 16; k++) { for (int l = 0; l < 16; l++) { for (int a = 0; a< 16; a++) { for (int b = 0; b< 16; b++) { for (int p = 0; p < 16; p++) { for (int q = 0; q < 16; q++) { if (!((i == 0 && j == 0) || (l == 0 && k == 0) || (a == 0 && b == 0)||(p == 0 && q == 0))){ sum[x]++; String twoHex1 = getTwoHex(i, j); String twoHex2 = getTwoHex(k, l); String twoHex3 = getTwoHex(a, b); String twoHex4 = getTwoHex(p, q); String str = twoHex1 + twoHex2 + twoHex3+ twoHex4; String pat=pattern(getResult(str)); int index=Integer.parseInt(pat, 2); count[x][index]++; } } } } } } } } } break; } } for(int r=0;r<=n;r++){ for(int s=0;s<=n;s++){ if(count[r][s]==0){ result[r][s]="0"; } else{ result[r][s]=String.valueOf(count[r][s]/255)+"/"+sum[r]/255; } } } return result; } /* 给出十进制的数,判断其四位二进制数中1的个数 */ private static int getItem(int x){ String str=bitList[x]; int count=0; for(int i=0;i<4;i++){ if(str.charAt(i)=='1'){ count++; } } return count; } private static void printResult(String[][] list){ int[] sequence={0,1,2,4,8,3,5,6,9,10,12,7,11,13,14,15}; System.out.printf("%-5s"," "); for(int i=1;i<list.length-1;i++){ String str=bitList[sequence[i]]; System.out.printf("%-20s",str); } System.out.println(); for(int r=1;r<list.length-1;r++) { System.out.printf("%-5s",bitList[sequence[r]]); for (int s = 1; s < list.length-1; s++) { String str=list[sequence[r]][sequence[s]]; System.out.printf("%-20s",str); } System.out.println(); } }}
阅读全文
1 0
- 编程实现表1(L的输入-输出模式分布),证实表1的正确性
- 关于虚表的疑惑与证实
- 验证身份证号输入的正确性[转]
- Javascript 验证输入表单的正确性
- JS判断输入日期的正确性
- JS判断输入日期的正确性
- JS判断输入日期的正确性
- 2.14-实现Length(L)返回链表L的长度
- MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
- MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
- MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
- MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
- MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
- MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
- JS判断两种格式的输入日期的正确性
- 验证身份证号输入的正确性-0611020-很不错
- 使用Int32.parse()方法要保证输入参数的正确性
- 编程:输出输入各个字符的个数
- Win7系统安装Visual C++ 6.0解决兼容性问题方法
- 基础的 mysql sql 语句,简单篇,拿起就用
- 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》
- MyEclipse:Java was started but returned exit code=-1
- 深度搜索算法
- 编程实现表1(L的输入-输出模式分布),证实表1的正确性
- web测试方法总结
- js判断linux服务器的图片是否存在
- js中的事件委托或是事件代理详解
- 数据结构实验之图论七:驴友计划
- Hadoop中的join
- 手动将经典 VM 从 VHD 迁移到新的 ARM 托管磁盘 VM
- 生成验证码页面 报 java.lang.IllegalStateException: getOutputStream() has already been called 解决办法
- mysql 修改忘记root密码