算法(第四版)1.1基础编程模型练习1.1.9-1.1.14

算法(第四版)

注:编码都是在一个项目中完成的,每一道题都是一个新类中的函数,最后全部放在了一个主函数中,主函数在本文的在最后。


1.1.9 编写一段代码,将一个正整数N用二进制表示并转化为一个String类型的值s。

编码:

public class Text1_1_9 {
          String decimalToBinary(int number)       //十进制转化二进制
        {
            String binarySystem="";               //定义一个字符串并令其为空
            while(true)
            { 
                int remainder=number%2==0?0:1;  //判断余数为0还是1,如果可以整除就为0,不能整除就为1.
                binarySystem=remainder+binarySystem;     //令余数加上字符串
                number/=2;
                if(number==0)                //如果十进制数为0便退出
                    break;
            }
            return binarySystem;
        }
}


1.1.10 下面这段代码有什么问题?

int[] a;
for(int i =0;i<10;i++)
 a[i]=i*i;
 java中定义数组的方法一共有三种:

    int[]  a=new int[10];                 //用new的方法定义
              
    int[]  a={1,2,3,6};                   //直接初始化
      
    int[] a=new int[]{1,2,3,4,5,6,7,22};  //new之后初始化在一个语句中完成
 而此题无new且在定义后初始化,也没有给数组分配大小,直接用循环初始化,因此错误。

 可以这样初始化这题的数组

 第一种方法:

int[] a=new int[10];     //用new的方法定义数组大小分配内存,再用循环分配大小。需要预先分配数组大小
for(int i=0,i<10;i++)
 a[i]=i*i;
 第二种方法:

int[] a={0,1,4,9,16,25,36,49,64,81};  //直接初始化    不用填写数组大小
 第三种方法:

int [] a=new int[]{0,1,4,9,16,25,36,49,64,81};//用new分配内存后直接初始化,不用填写数组大小

1.1.11 编写一段代码,打印出一个二维的布尔数组的内容。其中,使用*表示真,空格表示假。打印出行号和列号。

编码:

//第十一题
        System.out.println(" 编写一段代码,打印出一个二维的布尔数组的内容。其中,使用*表示真,空格表示假。打印出行号和列号。");
        boolean[][] list=new boolean[][] {{true,false},{false,true}};
        Text1_1_11 i=new Text1_1_11();
        i.printBooleanList(list,2,2);


public class Text1_1_11 {
        void printBooleanList(boolean list[][],int line,int row)//传递数组,以及数组的行数和列数
        {
            for(int i=0;i<row;i++)                             //打印列号
                System.out.print("\t"+i);
            System.out.println();
            for(int i=0;i<line;i++)
            {
                System.out.print(i);                          //打印行号
                for(int j=0;j<row;j++)
                {
                    //list[i][j]?System.out.println("*"):System.out.println(" "); //大神看一下为什么这个出错不可以运行,问题在哪里?
                    if(list[i][j])
                        System.out.print("\t*");
                    else
                        System.out.print("\t ");
                    if(j==row-1)
                        System.out.println();                 //一行输出完就换行
                    
                }
            }
                
        }
}

结果:

1.1.12 以下代码段会打印出什么结果

         int[] a=new int[10];
         for(int i=0;i<10;i++)
             a[i]=9-i;
         for(int i=0;i<10;i++)
             a[i]=a[a[i]];
         for(int i=0;i<10;i++)
             System.out.println(i);
编码:

public class Text1_1_12 {
	 void wahtPrint()
	 {
		 int[] a=new int[10];
		 for(int i=0;i<10;i++)
			 a[i]=9-i;          //初始化数组:9,8,7,6,5,4,3,2,1,0
		 for(int i=0;i<10;i++)
			 a[i]=a[a[i]];      //对a[a[i]],中间的a[i]为数组中下标为i的内容,此结果为将数组内容倒置
		 for(int i=0;i<10;i++)
			 System.out.println(i);
	 }
}

结果:

1.1.13 编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)

编码:

//第十三题
        System.out.println("编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)");
        Text1_1_13 k=new Text1_1_13();
        String[][] c=new String[][] {{"00","01","02"},{"10","11","12"}};
        System.out.println("输出未转置的二维数组:");
        k.printList(c, 2, 3);
        System.out.println("输出转置后的二维数组:");
        k.printList(k.lineToRow(c, 2, 3), 3, 2);

public class Text1_1_13 {
        String[][] lineToRow(String a[][],int line,int row)//2 3
        {
            String[][] c=new String[row][line];     //建立一个与输入数组行列数相反的二维数组
            for(int i=0;i<row;i++)
                for(int j=0;j<line;j++)
                {
                    c[i][j]=a[j][i];
                    
                }
            return c;
        }
        
        void printList(String a[][],int line,int row)   // 输出一个二维数组
        {
            for(int i=0;i<line;i++)
            {
                for(int j=0;j<row;j++)
                    System.out.print(a[i][j]+" ");
                System.out.println();
            }
        }
         

}

结果:


1.1.15编写一个静态方法lg(),接受一个整形参数N,返回不大于log2(N)的最大真是整数。不使用Math函数.

编码:

public class Text1_1_14 {
		 static int log(int x) {
				  int[] log_2 = {                                                             //对1-256进行log2(x)取整
						  0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
						  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,  
						  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
						  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
						  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
						  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
						  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
						  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8
				  };
				  int l = 0;
				  while (x >= 256)                                                             //如果大于256进入此循环
				  {          
					  l += 8 ;                                                                 //那么log2(X)的答案保底就是8 
					  x =x/(2^8);                                                              //看看x跟256的关系
				  }
				  return l + log_2[x];                                                          //相加求出结果
				}

}



猜你喜欢

转载自blog.csdn.net/qq_15227469/article/details/79129497
今日推荐