当前位置:文档之家› 算法 第四版 习题 答案

算法 第四版 习题 答案

算法 第四版 习题 答案
算法 第四版 习题 答案

1.1.1 给出以下表达式的值:

a. ( 0 + 15 ) / 2

b. 2.0e-6 * 100000000.1

c. true && false || true && true

答案:a.7,b.200.0000002 c.ture

1.1.2 给出以下表达式的类型和值:

a. (1 + 2.236)/2

b. 1 + 2 + 3 + 4.0

c. 4.1 >= 4

d. 1 + 2 + "3"

答案:a.1.618 b. 10.0 c.true d.33

1.1.3 编写一个程序,从命令行得到三个整数参数。如果它们都相等则打印equal,否则打印not equal。

public class TestUqual

{

public static void main(String[] args)

{

int a,b,c;

a=b=c=0;

StdOut.println("Please enter three numbers");

a =StdIn.readInt();

b=StdIn.readInt();

c=StdIn.readInt();

if(equals(a,b,c)==1)

{

StdOut.print("equal");

}

else

{

StdOut.print("not equal");

}

}

public static int equals(int a ,int b , int c)

{

if(a==b&&b==c)

{

return 1;

}

else

{

return 0;

}

}

}

1.1.4 下列语句各有什么问题(如果有的话)?

a. if (a > b) then c = 0;

b. if a > b { c = 0; }

c. if (a > b) c = 0;

d. if (a > b) c = 0 else b = 0;

答案:a. if (a > b) c = 0; b. if (a > b) { c = 0; }

1.1.5 编写一段程序,如果double 类型的变量x 和y 都严格位于0 和1 之间则打印true,否则打印false。

public class TestUqual

{

public static void main(String[] args)

{

double x;

double y;

x=StdIn.readDouble();

y=StdIn.readDouble();

StdOut.print(compare(x)&& compare(y));

}

public static boolean compare(double x)

{

If(x>0&&x<1)

returen ture;

else

return false;

}

}

1.1.6 下面这段程序会打印出什么?

int f = 0;

int g = 1;

for (int i = 0; i <= 15; i++)

{

StdOut.println(f);

f = f + g;

g = f - g;

}

答案:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

1.1.7 分别给出以下代码段打印出的值:

a. double t = 9.0;

while (Math.abs(t - 9.0/t) > .001)

t = (9.0/t + t) / 2.0;

StdOut.printf("%.5f\n", t);

b. int sum = 0;

for (int i = 1; i < 1000; i++)

for (int j = 0; j < i; j++)

sum++;

StdOut.println(sum);

c. int sum = 0;

for (int i = 1; i < 1000; i *= 2)

for (int j = 0; j < 1000; j++)

sum++;

StdOut.println(sum);

答案:a.3.00009 b.499500 c. 10000

1.1.8 下列语句会打印出什么结果?给出解释。

a. System.out.println('b');

b. System.out.println('b' + 'c');

c. System.out.println((char) ('a' + 4));

答案:a. b b. 197 c. e

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

解答:Java 有一个内置方法Integer.toBinaryString(N) 专门完成这个任务,但该题的目的就是给出这个方法的其他实现方法。

下面就是一个特别简洁的答案:

String s = "";

for (int n = N; n > 0; n /= 2)

s = (n % 2) + s;

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

int[] a;

for (int i = 0; i < 10; i++)

a[i] = i * i;

解答:它没有用new 为a[] 分配内存。这段代码会产生一个variable a might not have been initialized 的编译错误。

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

public class Test {

public Test() {

// TODO Auto-generated constructor stub

}

public static void main(String[] args) {

// TODO Auto-generated method stub

boolean[][] a = new boolean[10][10];

a=RandomInitial(a);//随机初始化

TestPrint(a);//打印数组

}

public static void TestPrint(boolean [][] a)

{

for(int i=0;i

StdOut.print(" "+i);

StdOut.println(" ");

for(int i=0;i<10;i++)

{

StdOut.print(i);

for(int j=0;j<10;j++)

{

if(a[i][j])

StdOut.print("*"+" ");

else

StdOut.print(" "+" ");

}

StdOut.println(" ");

}

}

public static boolean[][] RandomInitial( boolean [][] a)

{

for(int i=0;i

{

for(int j=0;j

{

if(StdRandom.bernoulli(0.1))

a[i][j]=true;

else

a[i][j]=false;

}

}

return a;

}

}

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);

答案:0 1 2 3 4 5 6 7 8 9

如System.out.println(a[i]);

0 1 2 3 4 4 3 2 1 0

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

public Migrate() {

// TODO Auto-generated constructor stub

}

public static void main(String[] args) {

// TODO Auto-generated method stub

int m=5;

int n=5;

int [][] a=new int [m][n];

int [][] b=new int [n][m];

a=RandomInitial(a,n); //初始化二维数组

b=MigrateArrays(a,b); //转置二维数组

MigratePrint(b);//输出转置二维数组

}

public static void MigratePrint(int [][] a)

{

StdOut.println("输出转置二维数组:");

for (int i=0;i

{

for(int j=0;j

{

StdOut.print(a[i][j]+" ");

}

StdOut.println();

}

}

public static int[][] MigrateArrays(int [][] a,int [][] b)

{

for (int i=0;i

{

for(int j=0;j

{

b[j][i]=a[i][j];

}

}

return b;

}

public static int[][] RandomInitial(int [][] a,int N)

{

StdOut.println("初始化二维数组:");

for (int i=0;i

{

for(int j=0;j

{

a[i][j]=StdRandom.uniform(N);

StdOut.print(a[i][j]+" ");

}

StdOut.println();

}

return a;

}

}

1.1.14 编写一个静态方法lg(),接受一个整型参数N,返回不大于log2N 的最大整数。不要使用Math 库。

public static int lga(int N,int M)

{

int a=0;

while(N>=M)

{

N=N/M;

a++;

}

return a;

}

1.1.15 编写一个静态方法histogram(),接受一个整型数组a[] 和一个整数M 为参数并返回一个大小为M的数组,其中第i个元素的值为整数i在参数数组中出现的次数。如果a[]中的值均在0到M-1之间,返回数组中所有元素之和应该和a.length 相等。

public static int[] histogram(int [] a,int M)

{

int[] b= new int [M];

int n=0;

int m=0;

for(int i=0;i

{

for(int j=0;j

{

if(i==a[j])

{

n++;

}

b[i]=n;

}

n=0;

}

for(int i=0;i

{

m=m+b[i];

}

return b;

}

1.1.16 给出exR1(6) 的返回值:

public static String exR1(int n)

{

if (n <= 0) return "";

return exR1(n-3) + n + exR1(n-2) + n;

}

答案:311361142246

1.1.17 找出以下递归函数的问题:

public static String exR2(int n)

{

String s = exR2(n-3) + n + exR2(n-2) + n;

if (n <= 0) return "";

return s;

}

答:这段代码中的基础情况永远不会被访问。调用exR2(3) 会产生调用exR2(0)、exR2(-3) 和exR2(-6),循环往复直到发生StackOverflowError。可以修改为:

public static String exR2(int n)

{

if (n <= 0) return "";

String s = exR2(n-3) + n + exR2(n-2) + n;

return s;

}

1.1.18 请看以下递归函数:

public static int mystery(int a, int b)

{

if (b == 0) return 0;

if (b % 2 == 0) return mystery(a+a, b/2);

return mystery(a+a, b/2) + a;

}

mystery(2, 25) 和mystery(3, 11) 的返回值是多少?给定正整数a 和b,mystery(a,b) 计算的结果是什么?将代码中的+ 替换为* 并将return 0 改为return 1,然后回答相同的问题。

答案:50,33. 225 311

1.1.19 在计算机上运行以下程序:public class Fibonacci

{

public static long F(int N)

{

if (N == 0) return 0;

if (N == 1) return 1;

return F(N-1) + F(N-2);

}

public static void main(String[] args)

{

for (int N = 0; N < 100; N++)

StdOut.println(N + " " + F(N));

}

}

计算机用这段程序在一个小时之内能够得到F(N) 结果的最大N 值是多少?开发F(N) 的一个更好的实现,用数组保存已经计算过的值。

public class Fibonacci

{

public static long F(int N)

{

if (N == 0) return 0;

if (N == 1) return 1;

return F(N-1) + F(N-2);

}

public static void main(String[] args)

{

int[] a=new int [100];

a=A(a);

}

public static long[] A(int[] a)

{

a[0]=0;

a[1]=1;

for (int N = 2; N < 100; N++)

{a[N]=a[N-1]+a[N-2];

StdOut.prin tln(N + " " +a[N]);

}

}

1.1.20 编写一个递归的静态方法计算ln(N!) 的值。

public static double factorialln(long N)

{

if(N>1)

return Math.ln(N)+factorialln(N-1);

else

return 0;

}

1.1.21 编写一段程序,从标准输入按行读取数据,其中每行都包含一个名字和两个整数。然后用printf() 打印一张表格,每行的若干列数据包括名字、两个整数和第一个整数除以第二个整数的结果,精确到小数点后三位。可以用这种程序将棒球球手的击球命中率或者学生的考试分数制成表格。

public class ScoreTable {

public static void main(String[] args) {

String s = "Let's go for lunch!";

In in = new In("Se");

String[] whitelist = in.readAllStrings();//将文件中的字符串读取到数组中for(int i=0;i

{

StdOut.print(whitelist[i]+" "+whitelist[i+1]+" "+whitelist[i+2]+" ");

double m=Double.parseDouble(whitelist[i+1]);

double n=Double.parseDouble(whitelist[i+2]);

StdOut.printf("0.3%",m/n);

StdOut.println(" ");

}

}

}

1.1.22 使用1.1.6.4 节中的rank() 递归方法重新实现BinarySearch 并跟踪该方法的调用。每当该方法被调用时,打印出它的参数lo 和hi 并按照递归的深度缩进。提示:为递归方法添加一个参数来保存递归的深度。

1.1.23 为BinarySearch 的测试用例添加一个参数:+ 打印出标准输入中不在白名单上的值;-,则打印出标准输入中在白名单上的值。

public static int rank(int key, int[] a,char c) {

int lo = 0;

int hi = a.length - 1;

if(c=='+')

{

while (lo <= hi) {

// Key is in a[lo..hi] or not present.

int mid = lo + (hi - lo) / 2;

if (key < a[mid]) hi = mid - 1;

else if (key > a[mid]) lo = mid + 1;

else

return mid;

}

return -1;

}

if(c=='-')

{

while (lo <= hi) {

// Key is in a[lo..hi] or not present.

int mid = lo + (hi - lo) / 2;

if (key < a[mid]) hi = mid - 1;

else if (key > a[mid]) lo = mid + 1;

else

return -1;

}

return 0;

}

else

return -1;

}

1.1.24 给出使用欧几里德算法计算105 和24 的最大公约数的过程中得到的一系列p 和q 的值。扩展该算法中的代码得到一个程序Euclid,从命令行接受两个参数,计算它们的最大公约数并打印出每次调用递归方法时的两个参数。使用你的程序计算1 111 111 和1 234 567 的最大公约数。

public static int CommomDivisor(int x,int y)

{

if(x==1||y==1)

{StdOut.println("x="+x+"y="+y);

return 1;}

if(x

{

int temp=x;

x=y;

y=temp;

}

StdOut.println("x="+x+"y="+y);

if(x%y==0)

{

return y;

}

else

{

x=x%y;

StdOut.println("x="+x);

return CommomDivisor( x,y);

}

}

1.1.25 使用数学归纳法证明欧几里德算法能够计算任意一对非负整数p 和q 的最大公约数。

提高题

1.1.26 将三个数字排序。假设a、b、c 和t 都是同一种原始数字类型的变量。证明以下代码能够将a、

b、c 按照升序排列:

if (a > b) { t = a; a = b; b = t; }

if (a > c) { t = a; a = c; c = t; }

if (b > c) { t = b; b = c; c = t; }

1.1.27 二项分布。估计用以下代码计算binomial(100, 50) 将会产生的递归调用次数:public static double binomial(int N, int k, double p)

{

if (N == 0 && k == 0) return 1.0; and if (N < 0 || k < 0) return 0.0;

return (1.0 - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1);

}

将已经计算过的值保存在数组中并给出一个更好的实现。

估计递归调用次数: 100!

public static double binomial(int N,int k,double p)

{

cnt++;

StdOut.println("N="+N+"k="+k+"p="+p);

if (N == 0 && k == 0)

{

StdOut.println("N == 0 && k == 0");

return 1.0;

}

if (N < 0 || k < 0)

{

StdOut.println("N < 0 || k <0");

return 0;

}

return (1.0 - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1,p);

}

值保存在数组中的实现方法:

public static void binomialArrays(int N,int K,double p)

{

double [][] a=new double[N+1][K+1];

a[0][0]=1;

for(int j=1;j

{

a[j][0]=a[j-1][0]*(1-p);

}

for (int i=0;i

for(int j=1;j<=i&&j

{

a[i][j]= (1-p)*a[i-1][j]+p*a[i-1][j-1];

}

}

思路:f(N-1,k)+p* f(N-1,K-1)

1.1.28 删除重复元素。修改BinarySearch 类中的测试用例来删去排序之后白名单中的所有重复元素。

public static int countC(int [] a)//排序后,统计重复数量

{

int cnt=0;

for(int i=0;i

if(a[i]== a[i+1])

{

s++;

}

return cnt;

}

public static int[] remove(int [] a,int cnt )

{

int s=0;

int[] b=new int[a.length-cnt];

b[0]=a[0];

for(int i=0;i

if(a[i]== a[i+1])

{

s++;

}

else{

b[i-s+1]=a[i+1];

}

return b;

}

1.1.29 等值键。为BinarySearch 类添加一个静态方法rank(),它接受一个键和一个整型有序数组(可能存在重复键)作为参数并返回数组中小于该键的元素数量,以及一个类似的方法count() 来返回数组中等于该键的元素的数量。注意:如果i 和j 分别是

rank(key,a) 和count(key,a)的返回值,那么a[i..i+j-1] 就是数组中所有和key 相等的元素。

import java.util.Arrays;

public class BinarySearch2 {

public BinarySearch2() {

// TODO Auto-generated constructor stub

}

/*返回小于key的元素数量

* */

public static int rank(int key, int[] a)

{int lo = 0;

int hi = a.length - 1;

while (lo <= hi) {

// Key is in a[lo..hi] or not present.

int mid = lo + (hi - lo) / 2;

if (key < a[mid]) hi = mid - 1;

else if (key > a[mid]) lo = mid + 1;

else {

while(a[mid]==a[mid-1]&&mid>0)

mid--;

return mid;

}

}

return-1;

}

public static int count (int key, int[] a)

{

int cnt=0;

int i=rank(key,a);

while(a[i]==a[i+1]&&i

{

cnt++;

i++;

}

return cnt;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

In in = new In("tinyW");

int[] whitelist = in.readAllInts();

Arrays.sort(whitelist);

int key=StdIn.readInt();

int cnt=rank(key,whitelist);

StdOut.println("smaller than "+key+" element have "+cnt );

int cntequal=count(key,whitelist);

StdOut.println("equal "+key+" element have "+cntequal );

}

}

1.1.30 数组练习。编写一段程序,创建一个N×N 的布尔数组a[][]。其中当i 和j 互质时(没有相同因子),a[i][j] 为true,否则为false。

public static boolean[][] TestArrays( boolean [][] a)//

{

int N=a.length;

int M=a[0].length;

StdOut.println(M+"=M"+"N="+N);

for(int i=0;i

for(int j=0;j

{

if(gcd(i,j)==1)

a[i][j]=true;

else

a[i][j]=false;

}

return a;

}

public static int gcd(int m,int n)

{

if(m==0||n==0)

{

return 1;

}

if(m%n==0)

{

return n;

}

else

{

return gcd(n,m%n);

}

}

1.1.31 随机连接。编写一段程序,从命令行接受一个整数N 和double 值p(0 到1 之间)作为参数,在一个圆上画出大小为0.05 且间距相等的N 个点,然后将每对点按照概率p 用灰线连接。

public class RandomAccess {

public RandomAccess() {

// TODO Auto-generated constructor stub

}

public static void drawcricle(double x,double y,double r,int

N,double p,double[][] a)

{

StdDraw.setXscale(0, x*2);

StdDraw.setYscale(0, y*2);

StdDraw.setPenRadius(0.005);

StdDraw.setPenColor(StdDraw.RED);

StdDraw.circle(50, 50, 50);

for(int i=0;i

{ StdDraw.setPenRadius(0.05);

StdDraw.setPenColor(StdDraw.BLACK);

double m=50-50*Math.cos(2*Math.PI*i/N);

double n=50+50*Math.sin(2*Math.PI*i/N);

StdDraw.point(m, n);

a[i][0]=m;

a[i][1]=n;

StdDraw.setPenColor(StdDraw.RED);

// StdDraw.text(m,n,i+" m="+m+" n="+n);

}

}

public static void Randomline(double x,double y,double[][] a)

{

StdDraw.setXscale(0, x*2);

StdDraw.setYscale(0, y*2);

StdDraw.setPenRadius(0.01);

StdDraw.setPenColor(StdDraw.LIGHT_GRAY);

int N=a.length;

for(int i=0;i

for(int j=0;j

{

if(StdRandom.bernoulli(0.5))

StdDraw.line(a[i][0], a[i][1], a[j][0], a[j][1]);

}

}

public static void main(String[] args) {

double x=50;

double y=50;

double r=50;

int N=10;

double p=0.2;

double[][] a=new double[N][2];

//画圆/描点

drawcricle(x,y,r,N,p,a);

//画线

Randomline(x,y,a);

}

}

1.1.32 直方图。假设标准输入流中含有一系列double 值。编写一段程序,从命令行接受一个整数N 和两个double 值l 和r。将(l,r) 分为N 段并使用StdDraw 画出输入流中的值落入每段的数量的直方图。

public class histogram {

/*将(l,r) 分为N段

* */

public static double[] segmentation(int N,double l,double r,double[] a) {

if(N==0) return a;

double s=(r-l)/N;

a[0]=l;

for(int i=1;i

{

a[i]=a[i-1]+s;

}

return a;

}

public static void makehistogram(double[] a,double[] b,double l,double r)

{

int[] c=new int[a.length-1];

for(int i=0;i

for(int j=0;j

{

if(b[i]>=a[j]&&b[i]

{

c[j]++;

continue;

}

}

int N=c.length;

StdDraw.setXscale(0,(r-l)*1.2 );

StdDraw.setYscale(0, b.length/N*1.5);

for(int i=0;i

{

double x = l+(r-l)/N*i;

double y = c[i]/2.0;

double rw = (r-l)/(2*N);

double rh = c[i]/2.0;

StdDraw.filledRectangle(x, y, rw, rh);

StdOut.print(c[i]+" ");

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

int N=10;//段数

double l=2;

double r=20;

double [] a=new double[N+1];//记录分段的节点

double [] b=new double[N*N*N];//随机产生一个数组,作为输入数字。

a=segmentation(N,l,r,a);

for(int i=0;i

{

b[i]=StdRandom.uniform(l, r);

}

makehistogram(a,b,l,r);

}

}

1.1.33 矩阵库。编写一个Matrix 库并实现以下API:

public class Matrix

static double dot(double[] x, double[] y) 向量点乘

static double[][] mult(double[][] a, double[][] b) 矩阵和矩阵之积

static double[][] transpose(double[][] a) 转置矩阵

static double[] mult(double[][] a, double[] x) 矩阵和向量之积

static double[] mult(double[] y, double[][] a) 向量和矩阵之积

编写一个测试用例,从标准输入读取矩阵并测试所有方法。

public class Matrix {

public Matrix() {

// TODO Auto-generated constructor stub

}

public static double dot(double[] x, double[] y)//向量点乘

{

double a=0;

if(x.length!=y.length)

{ return a; }//此处抛出异常

for(int i=0;i

a+=x[i]*y[i];

return a;

}

public static double[][] transpose(double[][] a)// 转置矩阵

{

for (int i=0;i

{

for(int j=i;j

{

double temp=a[i][j];

a[i][j]=a[j][i];

a[j][i]=temp;

}

}

return a;

}

/*

* 矩阵的乘积定义:一个n行m列的矩阵乘以一个m行p列的矩阵,得到的结果是一个n 行p列的矩阵,

* 其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应

* 相乘后所有m个乘积的和。

* */

static double[][] mult(double[][] a, double[][] b)// 矩阵和矩阵之积

{

int M=a[0].length;

int N=a.length;

int P=b[0].length;

double[][] c=new double[M][P];

if(M!=b.length)

{}//此处抛出异常

for(int i=0;i

for(int j=0;j

{for(int m=0;m

c[i][j]+=a[i][m]*b[m][j];

}

return c;

}

public static double[] mult(double[][] a, double[] x)//矩阵和向量之积

{

int N=a.length;

double[] c=new double[N];

int M=a[0].length;

if(M!=x.length)

{}//此处抛出异常

for(int i=0;i

{for(int m=0;m

c[i]+=a[i][m]*x[m];

}

return c;

}

public static double[] mult(double[] y, double[][] a) //向量和矩阵之积{

int N=y.length;

double[] c=new double[N];

int M=y.length;

if(M!=a[0].length)

{}//此处抛出异常

for(int i=0;i

{for(int m=0;m

c[i]+=a[i][m]*y[i];

}

return c;

}

public static void Print(double [][] a , String name)

{

StdOut.println(name+":");

for (int i=0;i

{

for(int j=0;j

{

StdOut.print(a[i][j]+" ");

}

StdOut.println();

}

StdOut.println();

}

public static void Print(double [][] a )

{

for (int i=0;i

{

for(int j=0;j

{

StdOut.print(a[i][j]+" ");

}

StdOut.println();

}

StdOut.println();

}

public static void Print(double [] a , String name)

{

StdOut.println(name+":");

for (int i=0;i

{

StdOut.print(a[i]+" ");

if((i+1)%10==0)

StdOut.println();

}

StdOut.println();

}

public static void Print(double [] a )

{

for (int i=0;i

{

StdOut.print(a[i]+" ");

if((i+1)%10==0)

StdOut.println();

}

StdOut.println();

}

public static double[][] randominti(double[][] a)

{

int N=a.length;

int M=a[0].length;

for(int i=0;i

{

for(int j=0;j

{

a[i][j]=StdRandom.uniform(N+M);

}

}

return a;

}

public static double[] randominti(double[] a)

{

int N=a.length;

for(int i=0;i

{

a[i]=StdRandom.uniform(N);

}

return a;

}

//测试用例

public static void main(String[] args) {

// TODO Auto-generated method stub

int N=5;

int p=10;

double[][] a=new double[N][N];

double[][] b =new double[p][N];

double[] c=new double[N];

double d =0;

a=randominti(a);

b=randominti(b);

c=randominti(c);

d=dot(c,c);

Print(c,"c");

StdOut.print("dot(c,c):d="+d);

Print(a,"a");

Print(b,"b");

double[][] x=new double[a[0].length][a.length];

x= transpose(a);

Print(x,"transpose(a)to x");

x=mult(a,b);

Print(x,"mult(a,b)");

double[] y=c;

y=mult(a,c);

Print(y,"mult(a,c)");

y=mult(c,a);

Print(y,"mult(c,a)");

}

}

1.1.34 过滤。以下哪些任务需要(在数组中,比如)保存标准输入中的所有值?哪些可以被实现为一个过滤器且仅使用固定数量的变量和固定大小的数组(和N 无关)?在每个问题中,输入都来自于标准输入且含有N 个0 到1 的实数。

打印出最大和最小的数

打印出所有数的中位数

打印出第k 小的数,k 小于100

打印出所有数的平方和

打印出N 个数的平均值

打印出大于平均值的数的百分比

将N 个数按照升序打印

将N 个数按照随机顺序打印

实验题

1.1.35 模拟掷骰子。以下代码能够计算每种两个骰子之和的准确概率分布:

int SIDES = 6;

double[] dist = new double[2*SIDES+1];

for (int i = 1; i <= SIDES; i++)

for (int j = 1; j <= SIDES; j++)

dist[i+j] += 1.0;

for (int k = 2; k <= 2*SIDES; k++)

dist[k] /= 36.0;

dist[i] 的值就是两个骰子之和为i 的概率。用实验模拟N 次掷骰子,并在计算两个1 到6 之间的随机整数之和时记录每个值的出现频率以验证它们的概率。N 要多大才能够保证你的经验数据和准确数据的吻合程度达到小数点后三位?

答案:108

测试用例:

public class rolltheDice {

public rolltheDice() {

// TODO Auto-generated constructor stub

}

public static double[] simulation(double[] a,int N,int SIDES)

{

for(int i=0;i

{

int n=1+StdRandom.uniform(SIDES);

int m=1+StdRandom.uniform(SIDES);

a[n+m]=a[n+m]+1.0;

}

for (int k = 2; k <= 2*SIDES; k++)

{

a[k]= a[k]/N;

}

return a;

}

public static void match(double[] dist,double[] dist2,int SIDES,int N) {

boolean Ismatch=true;

for(int n=N;Ismatch;n=n+n/10)

{

算法题目及答案

根据两个有序单链表生成一个新的有序单链表,原有单链表保持不变。要求新生成的链表中不允许有重复元素。 算法如下 ListNode * Merge ( ListNode * L1, ListNode * L2 ) {//根据两个带表头结点的有序单链表L1和L2, 生成一个新的有序单链表 ListNode *first = new ListNode; ListNode *p1 = L1->link, *p2 = L2->link, *p = first, *q; while ( p1 != NULL && p2 != NULL ) { q = new ListNode; if ( p1->data == p2->data ) { q->data = p1->data; p2 = p2->link; p1 = p1->link; } else if ( p1->data < p2->data ) { q->data = p1->data; p1 = p1->link; } else { q->data = p2->data; p2 = p2->link; } p->link = q; p = q; } while ( p1 != NULL ) { q = new ListNode; q->data = p1->data; p1 = p1->link; p->link = q; p = q; } while ( p2 != NULL ) { q = new ListNode; q->data = p2->data; p2 = p2->link; p->link = q; p = q; } p->link = NULL; return first; } 2. 设有一个线性表(e0, e1, …, e n-2, e n-1) 存放在一个一维数组A[arraysize]中的前n个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前n个原址内容置换为(e n-1, e n-2, …, e1, e0)。 数组原地逆置算法 参数表中给出数组A[ ] 及指定的数组中前n个元素,函数执行后从A[ ] 中得到数组原地逆置后的结果。 Template void inverse ( T A[ ], int n ) { T tmp; for ( int I = 0; I <= ( n-1 ) / 2; I++ ) { tmp = A[I]; A[I] = A[n-I-1]; A[n-I-1] = tmp;}

C语言程序设计课后习题答案(第四版)谭浩强

第1章程序设计和C语言1 什么是计算机程序1 什么是计算机语言1 语言的发展及其特点3 最简单的C语言程序5 最简单的C语言程序举例6 语言程序的结构10 运行C程序的步骤与方法12 程序设计的任务14 1-5 #include <> int main ( ) { printf ("**************************\n\n"); printf(" Very Good!\n\n"); printf ("**************************\n"); return 0; } 1-6#include <> int main() {int a,b,c,max; printf("please input a,b,c:\n"); scanf("%d,%d,%d",&a,&b,&c); max=a; if (max

怎样表示一个算法22 用自然语言表示算法22 用流程图表示算法22 三种基本结构和改进的流程图26 用N S流程图表示算法28 用伪代码表示算法31 用计算机语言表示算法32 结构化程序设计方法34 习题36 第章最简单的C程序设计——顺序程序设计37 顺序程序设计举例37 数据的表现形式及其运算39 常量和变量39 数据类型42 整型数据44 字符型数据47 浮点型数据49 怎样确定常量的类型51 运算符和表达式52 语句57 语句的作用和分类57 最基本的语句——赋值语句59 数据的输入输出65 输入输出举例65 有关数据输入输出的概念67 用printf函数输出数据68 用scanf函数输入数据75 字符数据的输入输出78 习题82 3-1 #include <> #include <> int main() {float p,r,n; r=; n=10; p=pow(1+r,n); printf("p=%f\n",p); return 0; }

《数值计算方法》试题集及答案

《数值计算方法》复习试题 一、填空题: 1、????? ?????----=410141014A ,则A 的LU 分解为 A ??? ?????????=? ?????????? ?。 答案: ?? ????????--??????????--=1556141501 4115401411A 2、已知3.1)3(,2.1)2(,0.1)1(===f f f ,则用辛普生(辛卜生)公式计算求得 ?≈3 1 _________ )(dx x f ,用三点式求得≈')1(f 。 答案:, 3、1)3(,2)2(,1)1(==-=f f f ,则过这三点的二次插值多项式中2 x 的系数为 , 拉格朗日插值多项式为 。 答案:-1, )2)(1(21 )3)(1(2)3)(2(21)(2--------= x x x x x x x L 4、近似值*0.231x =关于真值229.0=x 有( 2 )位有效数字; 5、设)(x f 可微,求方程)(x f x =的牛顿迭代格式是( ); ( 答案 )(1)(1n n n n n x f x f x x x '--- =+ 6、对1)(3 ++=x x x f ,差商=]3,2,1,0[f ( 1 ),=]4,3,2,1,0[f ( 0 ); 7、计算方法主要研究( 截断 )误差和( 舍入 )误差; 8、用二分法求非线性方程 f (x )=0在区间(a ,b )内的根时,二分n 次后的误差限为 ( 1 2+-n a b ); 9、求解一阶常微分方程初值问题y '= f (x ,y ),y (x 0)=y 0的改进的欧拉公式为

( )] ,(),([2111+++++=n n n n n n y x f y x f h y y ); 10、已知f (1)=2,f (2)=3,f (4)=,则二次Newton 插值多项式中x 2系数为( ); 11、 两点式高斯型求积公式?1 d )(x x f ≈( ?++-≈1 )] 321 3()3213([21d )(f f x x f ),代数精 度为( 5 ); 12、 解线性方程组A x =b 的高斯顺序消元法满足的充要条件为(A 的各阶顺序主子式均 不为零)。 13、 为了使计算 32)1(6 )1(41310-- -+-+ =x x x y 的乘除法次数尽量地少,应将该表 达式改写为 11 ,))64(3(10-= -++=x t t t t y ,为了减少舍入误差,应将表达式 19992001-改写为 199920012 + 。 14、 用二分法求方程01)(3 =-+=x x x f 在区间[0,1]内的根,进行一步后根的所在区间 为 ,1 ,进行两步后根的所在区间为 , 。 15、 、 16、 计算积分?1 5 .0d x x ,取4位有效数字。用梯形公式计算求得的近似值为 ,用辛卜 生公式计算求得的近似值为 ,梯形公式的代数精度为 1 ,辛卜生公式的代数精度为 3 。 17、 求解方程组?? ?=+=+042.01532121x x x x 的高斯—塞德尔迭代格式为 ?????-=-=+++20/3/)51()1(1)1(2)(2)1(1 k k k k x x x x ,该迭 代格式的迭代矩阵的谱半径)(M ρ= 121 。 18、 设46)2(,16)1(,0)0(===f f f ,则=)(1x l )2()(1--=x x x l ,)(x f 的二次牛顿 插值多项式为 )1(716)(2-+=x x x x N 。 19、 求积公式 ?∑=≈b a k n k k x f A x x f )(d )(0 的代数精度以( 高斯型 )求积公式为最高,具 有( 12+n )次代数精度。

试题及参考答案

一、选择题 1. 美国总统的任期是()。 B 年年年年 2下列国家中不采用单一制有()。 B A.法国 B.瑞士 C.日本 D德国 3.最早实行联邦制的国家是()。 C A.法国 B.中国 C.美国 D.日本 4. 比较研究原则作为进行行政制度比较分析的指导思想和基本要求。比较研究原则不包括()A A客观性原则 B可对比性原则 C实践性原则 D 依照宪法原则 5 下列选项中不是内阁制政府制度的特征的是() C A 议会至上 B国家元首虚位 C合一决策 D 政府对议会负责 二、判断题 1.广义的政府是泛指依法形式国家权力的一切机关,包括立法机关、立法机关和行政机关。 ()对 2.日本实行君主立宪制、议会民主制。()对 3.美国总统必须对国会负责。()错英国 4.英国中央政府机构体系主要由枢密院、内阁办公机构和政府成。()错政府各部 5.法国总统可以直接任免总理,无须征得议会的同意,也不需向任何部门商量。()对 三、简答题 1、比较民族区域自治制度与特别行政区制度的异同。 2、中央行政体制的类型和特点有哪些 四、论述题 分析论述影响现代行政决策体制的要素 参考答案 三、简答题1: 1 确立的时间、地区不同 2确定设立的法律依据不同 3 设立目的不同 4 社会制度不同。 5自治层次不同。 6自治程度不同。 7行使权力的大小不同 8中央对它们的干预程度不同及立法、行政、司法权不同 简答题2: 1内阁制

特点: 1行政、立法合一,而非明显之三权分立,而且无总统制式的制衡机制. 2国家元首与行政首长分由两人担任. 3行政首长的产生是建立在议会的同意之上,并对议会负责. 4元首发布命令时,需经行政首长或有关阁员副署,以明权责,其责任则由副署者承担.无副署者,则元首之政令不生效力. 5国家元首平常主要承担仪式性任务. 6行政首长系由间接方式产生. 7议会通常有『倒阁权』,内阁通常也有『国会解散权』,但亦有特例 2 总统制 特点:总统由全国选民直接选举产生,不需要议会批准。总统既是国家元首,又是国家最高行政机关的政府首脑。总统对全国选民负责,不对议会负责。政府由总统组阁,不需要得到议会大多数的支持。议会中的政党对总统没有直接的决定性影响,总统所在的政党并不一定是议会中的多数党。总统是国家的权力中心和决策中心。由总统组织和领导内阁,各部部长是内阁成员。内阁成员不能兼任议会议员。总统没有向议会提出法案的权力,但对议会通过的法案有签署权,并且有否决权。但是,议会也可以以三分之二的多数推翻总统的否决,该法案就可以立即成为法律生效。议会没有对总统投不信任票或迫使总统辞职的权力,但可以对总统违法违宪的行为进行弹劾。总统也无权解散议会。 3半总统制 特点: 1总统是国家元首,由普选产生; 2总统有权组织政府,掌握国家最高行政权;总统有权任命总理; 3总统主持内阁会议,签署内阁决议和法令,但不承担内阁决议的政治责任; 4总统可将议会立法退回复议,议会不得拒绝; 5总统有权在同总理及议会两院议长磋商后解散议会,但总统不对议会负责;6议会拥有对政府的质询权,财政监督权和弹劾权,但议会不能动摇总统的地位;7内阁总理承担内阁决议的责任,并向议会负责。 4委员会制 特点: 1、实行委员会制的国家,全国最高的行政权力是由一个委员会来履行。委员会由一定数目的委员组成,委员会主席由委员轮流担任,而且仅为名义上的国家元首和最高行政长官,并无特殊的职权。2、委员会从本质上说是代议制民主政体,它具有人民直接民主的特点,委员会作为最高行政权力机关,各委员权力均等,而且都不能兼任议会的议员。除非委员自己辞职,否则任何机关均无权对其罢免或将其免职。 3、联邦委员会是联邦议会的执行机关,要服从议会的政策,不得解散议会,而议会也不得解散联邦委员会。 4、委员会委员的出任,由政党推荐,但本人不一定是政党领袖,并且一旦当选,就不以该党身份参与领导工作,只对委员会负责。 5部长会议体制 特点:略 6国务院体制 特点:体现了国务院总理负责制总理负责制是指国务院总理对他主管的工作负全部责任,与此相联系,他对自己主管的工作有完全决定权利具体内容是: 1.由总理提名组成国务院 2.总理领导国务院工作 3.总理主持召开国务院常务会议和全体会议,对于所议事项,总理有最后的决定权利,并以决定的后果承担全部 责任 四、论述题 政治要素。(略)经济要素。(略)文化要素。(略)科技要素(略) 1、下列哪一项不属于比较研究的方法(D)

1-1算法的概念练习题及答案

[当堂达标] 1.我们已学过的算法有一元二次方程的求根公式、加减消元法求二元一次方程组的解、二分法求函数零点等,对算法的描述有: ①对一类问题都有效; ②对个别问题有效; ③计算可以一步一步进行,每一步都有唯一结果; ④是一种通法,只要按部就班地做,总能得到结果. 以上描述正确的有( ) A .1个 B .2个 C .3个 D .4个 答案:C 解析:设计的算法应该是对一类问题都有效,而不是只对个别问题有效.所以①对,②不对.由算法的确定性、有限性、顺序性易知③④都是正确的,故描述正确的有3个. ; 2.下列所给问题中,不能设计一个算法求解的是( ) A .用二分法求方程x 2-3=0的近似解(精确到 B .解方程组????? x +y +5=0,x -y +3=0 C .求半径为2的球的体积 D .判断y =x 2在R 上是否具有单调性 答案:D 解析:选项A ,B ,C 中的问题都可以设计算法求解,而D 项中的问题则不能设计算法求解. 3.“已知直角三角形两直角边长为a ,b ,求斜边长c ”的一个算法分下列三步: ①计算c =a 2+b 2; ②输入直角三角形两直角边长a ,b 的值;

③输出斜边长c 的值. : 其中正确的顺序是________. 答案:②①③ 解析:根据运算顺序,易知算法顺序应是②①③. 4.已知一个学生的语文成绩为89,数学成绩为96,外语成绩为99,求它的总分和平均分的一个算法如下,请将其补充完整: 第一步:取A =89,B =96,C =99. 第二步,_____________________________________________. 第三步,_____________________________________________. 第四步,输出计算结果. 答案:计算总分D =A +B +C 计算平均分E =D 3 5.已知函数y =????? -x 2-1x ≤-1,x 3x >-1,试设计一个算法,输入x 的值,求对应的函数值. ^ 解:算法如下: 第一步,输入x 的值; 第二步,当x ≤-1时,计算y =-x 2-1,否则执行第三步; 第三步,计算y =x 3; 第四步,输出y . [课堂小结] 1.算法的特点:有限性、确定性、逻辑性、不唯一性、普遍性. 2.算法设计的要求: (1)写出的算法必须能够解决一类问题(如判断一个整数是否为质数,求任意一个方程的近似解等),并且能够重复使用.

#《C语言程序设计》课后习题答案(第四版)谭浩强

第1章程序设计和C语言1 1.1什么是计算机程序1 1.2什么是计算机语言1 1.3C语言的发展及其特点3 1.4最简单的C语言程序5 1.4.1最简单的C语言程序举例6 1.4.2C语言程序的结构10 1.5运行C程序的步骤和方法12 1.6程序设计的任务14 1-5 #include int main ( ) { printf ("**************************\n\n"); printf(" Very Good!\n\n"); printf ("**************************\n"); return 0; } 1-6#include int main() {int a,b,c,max; printf("please input a,b,c:\n"); scanf("%d,%d,%d",&a,&b,&c); max=a; if (max

第章最简单的C程序设计——顺序程序设计37 3.1顺序程序设计举例37 3.2数据的表现形式及其运算39 3.2.1常量和变量39 3.2.2数据类型42 3.2.3整型数据44 3.2.4字符型数据47 3.2.5浮点型数据49 3.2.6怎样确定常量的类型51 3.2.7运算符和表达式52 3.3C语句57 3.3.1C语句的作用和分类57 3.3.2最基本的语句——赋值语句59 3.4数据的输入输出65 3.4.1输入输出举例65 3.4.2有关数据输入输出的概念67 3.4.3用printf函数输出数据68 3.4.4用scanf函数输入数据75 3.4.5字符数据的输入输出78 习题82 3-1 #include #include int main() {float p,r,n; r=0.1; n=10; p=pow(1+r,n); printf("p=%f\n",p); return 0; } 3-2-1 #include #include int main() {float r5,r3,r2,r1,r0,p,p1,p2,p3,p4,p5; p=1000; r5=0.0585; r3=0.054; r2=0.0468; r1=0.0414; r0=0.0072; p1=p*((1+r5)*5); // 一次存5年期 p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期

计算方法的课后答案

《计算方法》习题答案 第一章 数值计算中的误差 1.什么是计算方法?(狭义解释) 答:计算方法就是将所求的的数学问题简化为一系列的算术运算和逻辑运算,以便在计算机上编程上机,求出问题的数值解,并对算法的收敛性、稳定性和误差进行分析、计算。 2.一个实际问题利用计算机解决所采取的五个步骤是什么? 答:一个实际问题当利用计算机来解决时,应采取以下五个步骤: 实际问题→建立数学模型→构造数值算法→编程上机→获得近似结果 4.利用秦九韶算法计算多项式4)(5 3 -+-=x x x x P 在3-=x 处的值,并编程获得解。 解:400)(2 3 4 5 -+?+-?+=x x x x x x P ,从而 所以,多项式4)(5 3 -+-=x x x x P 在3-=x 处的值223)3(-=-P 。 5.叙述误差的种类及来源。 答:误差的种类及来源有如下四个方面: (1)模型误差:数学模型是对实际问题进行抽象,忽略一些次要因素简化得到的,它是原始问题的近似,即使数学模型能求出准确解,也与实际问题的真解不同,我们把数学模型与实际问题之间存在的误差称为模型误差。 (2)观测误差:在建模和具体运算过程中所用的一些原始数据往往都是通过观测、实验得来的,由于仪器的精密性,实验手段的局限性,周围环境的变化以及人们的工作态度和能力等因素,而使数据必然带有误差,这种误差称为观测误差。 (3)截断误差:理论上的精确值往往要求用无限次的运算才能得到,而实际运算时只能用有限次运算的结果来近似,这样引起的误差称为截断误差(或方法误差)。 (4)舍入误差:在数值计算过程中还会用到一些无穷小数,而计算机受机器字长的限制,它所能表示的数据只能是一定的有限数位,需要把数据按四舍五入成一定位数的近似的有理数来代替。这样引起的误差称为舍入误差。 6.掌握绝对误差(限)和相对误差(限)的定义公式。 答:设* x 是某个量的精确值,x 是其近似值,则称差x x e -=* 为近似值x 的绝对误差(简称误差)。若存在一个正数ε使ε≤-=x x e * ,称这个数ε为近似值x 的绝对误差限(简称误差限或精度)。 把绝对误差e 与精确值* x 之比* **x x x x e e r -==称为近似值x 的相对误差,称

心理学题库及参考答案

第1章心理学概述 一、单项选择题 1.现代认知心理学以1967年【】出版的《认知心理学》为诞生标志。 A.奈塞尔 B.冯特 C.斯金纳 D.弗洛伊德 2.一个令人高兴的信息,会导致人们手舞足蹈。这是【】 A.兴奋的扩散 B.兴奋的集中 C.抑制的扩散 D.抑制的集中 3.世界上第一个心理学实验室创建于【】 A.1888年 B.1879年 C.1878年 D.1877年 4.心理学通常把个性心理特征分为三个方面,一是能力,二是气质,三是【】 A.性格 B.动机 C.兴趣 D.意志 5.听觉中枢位于【】 A.额叶 B.顶叶 C.颞叶 D.枕叶 6.由于晚上学习到很晚,第二天无精打采。这属于【】 A.相继正诱导 B.同时正诱导 C.相继负诱导 D.同时负诱导 7.格式塔学派是西方主要的心理学流派之一,其中“格式塔”的含义是【】(2012年烟台市市直) A.行为 B.精神

C.整体 D.人本 8.张明打了通宵的游戏,以致于第二天上课时无精打采。这属于【】 A.同时性负诱导 B.相继正诱导 C.相继负诱导 D.同时性正诱导 9.神经元具有【】的功能。 A.接受刺激、传递信息和整合信息 B.接受刺激、传递信息和发动反应 C.接受刺激、整合信息和发动反应 D.接受刺激、转换能量和传递信息 10.狗听到主人唤它的名字就跑过去是【】。(2013年滨州阳信) A.无条件反射 B.本能的反射 C.第一信号的条件反射 D.第二信号的条件反射 11.精神分析学派的创始人是【】 A.华生 B.弗洛伊德 C.罗杰斯 D.奈塞尔 12.我们在做数学题时用的是____,听音乐时用的是____。【】 A.左脑右脑 B.右脑左脑 C.左脑左脑 D.右脑右脑 13.构造主义主张研究【】 A.认知 B.意识 C.行为 D.无意识 14.辩证唯物主义者认为,心理是脑的机能,【】是心理的器官。 A.神经系统 B.大脑皮层 C.神经元 D.脑

算法分析习题参考标准答案

习题一复杂性分析初步 1. 试确定下述程序的执行步数,该函数实现一个m×n矩阵与一个n×p矩阵之间的乘法: 矩阵乘法运算 template void Mult(T **a, T **b, int m, int n, int p) {//m×n矩阵a与n×p矩阵b相成得到m×p矩阵c for(int i=0; i

找最大最小元素 方法一 template bool MinMax(T a[], int n, int& Min, int& Max) {//寻找a[0:n-1]中的最小元素与最大元素 //如果数组中的元素数目小于1,则还回false if(n<1) return false; Min=Max=0; //初始化 for(int i=1; ia[i]) Min=i; if(a[Max] bool MinMax(T a[], int n, int& Min, int& Max) {//寻找a[0:n-1]中的最小元素与最大元素 //如果数组中的元素数目小于1,则还回false if(n<1) rreturn false; Min=Max=0; //初始化 for(int i=1; ia[i]) Min=i; else if(a[Max]

计算机操作系统课后习题答案第三章(第四版)

第三章处理机调度与死锁 1,高级调度与低级调度的主要任务是什么?为什么要引入中级调度? 【解】(1)高级调度主要任务是用于决定把外存上处于后备队列中的那些作业调入内存,并为它们创建进程,分配必要的资源,然后再将新创建的进程排在就绪队列上,准备执行。(2)低级调度主要任务是决定就绪队列中的哪个进程将获得处理机,然后由分派程序执行把处理机分配给该进程的操作。(3)引入中级调度的主要目的是为了提高内存的利用率和系统吞吐量。为此,应使那些暂时不能运行的进程不再占用宝贵的内存空间,而将它们调至外存上去等待,称此时的进程状态为就绪驻外存状态或挂起状态。当这些进程重又具备运行条件,且内存又稍有空闲时,由中级调度决定,将外存上的那些重又具备运行条件的就绪进程重新调入内存,并修改其状态为就绪状态,挂在就绪队列上,等待进程调度。 3、何谓作业、作业步和作业流? 【解】作业包含通常的程序和数据,还配有作业说明书。系统根据该说明书对程序的运行进行控制。批处理系统中是以作业为基本单位从外存调入内存。作业步是指每个作业运行期间都必须经过若干个相对独立相互关联的顺序加工的步骤。 作业流是指若干个作业进入系统后依次存放在外存上形成的输入作业流;在操作系统的控制下,逐个作业进程处理,于是形成了处理作业流。 4、在什么情冴下需要使用作业控制块JCB?其中包含了哪些内容? 【解】每当作业进入系统时,系统便为每个作业建立一个作业控制块JCB,根据作业类型将它插入到相应的后备队列中。 JCB 包含的内容通常有:1) 作业标识2)用户名称3)用户账户4)作业类型(CPU 繁忙型、I/O芳名型、批量型、终端型)5)作业状态6)调度信息(优先级、作业已运行)7)资源要求8)进入系统时间9) 开始处理时间10) 作业完成时间11) 作业退出时间12) 资源使用情况等 5.在作业调度中应如何确定接纳多少个作业和接纳哪些作业? 【解】作业调度每次接纳进入内存的作业数,取决于多道程序度。应将哪些作业从外存调入内存,取决于采用的调度算法。最简单的是先来服务调度算法,较常用的是短作业优先调度算法和基于作业优先级的调度算法。 7.试说明低级调度的主要功能。 【解】(1)保存处理机的现场信息(2)按某种算法选取进程(3)把处理机分配给进程。 8、在抢占调度方式中,抢占的原则是什么? 【解】剥夺原则有:(1)时间片原则各进程按时间片运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。这种原则适用于分时系统、大多数实时系统,以及要求较高的批处理系统。(2)优先权原则通常是对一些重要的和紧急的作业赋予较高的优先权。当这种作业到达时,如果其优先权比正在执行进程的优先权高,便停止正在执行的进程,将处理机分配给优先权高的进程,使之执行。(3)短作业(进程)优先原则当新到达的作业(进程)比正在执行的作业(进程)明显地短时,将剥夺长作业(进程)的执行,将处理机分配给短作业(进程),使之优先执行。 9、选择调度方式和调度算法时,应遵循的准则是什么? 【解】应遵循的准则有(1)面向用户的准则:周转时间短,响应时间快,截止时间的保证,优先权准则。(2)面向系统的准则:系统吞吐量高,处理机利用率好,各类资源的平衡利用。 10、在批处理系统、分时系统和实时系统中,各采用哪几种进程(作业)调度算法? 【解】 批处理系统:FCFS算法、最小优先数优先算法、抢占式最小优先数优先算法 2 分时系统:可剥夺调度、轮转调度 实时系统:时间片轮转调度算法、非抢占优先权调度算法、基于时钟中断抢占的优先权调度算法、立即抢占的优先权调度。 11、何谓静态和动态优先权?确定静态优先权的依据是什么? 【解】静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变。动态优先权是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。确定静态优先权的依据是:(1)进程类型,通常系统进程的优先权高于一般用户进程的优先权。(2)进程对资源的需要。(3)用户要求,用户进程的紧迫程度及用户所付费用的多少来确定优先权的。 12、试比较FCFS和SPF两种进程调度算法。 【解】FCFS算法按照作业提交或进程变为就绪状态的先后次序,分派CPU。当前作业或进程占有CPU,直到执行完或阻塞,才让出CPU。在作业或进程唤醒后,并不立即恢复执行,通常等到当前作业或进程让出CPU。FCFS比较有利于长作业,而不利于短作业;有利于CPU繁忙的作业,而不利于I/O繁忙的作业。SPF有利于短进程调度,是从就绪队列中选出一估计运行时间最短的进

计算方法练习题与答案

练习题与答案 练习题一 练习题二 练习题三 练习题四 练习题五 练习题六 练习题七 练习题八 练习题答案 练习题一 一、是非题 1.–作为x的近似值一定具有6位有效数字,且其误差限。() 2.对两个不同数的近似数,误差越小,有效数位越多。() 3.一个近似数的有效数位愈多,其相对误差限愈小。()

4.用近似表示cos x产生舍入误差。 ( ) 5.和作为的近似值有效数字位数相同。 ( ) 二、填空题 1.为了使计算的乘除法次数尽量少,应将该表达式改写 为; 2.–是x舍入得到的近似值,它有位有效数字,误差限 为,相对误差限为; 3.误差的来源是; 4.截断误差 为; 5.设计算法应遵循的原则 是。 三、选择题 1.–作为x的近似值,它的有效数字位数为( ) 。 (A) 7; (B) 3; (C) 不能确定 (D) 5. 2.舍入误差是( )产生的误差。 (A) 只取有限位数 (B) 模型准确值与用数值方法求得的准确值 (C) 观察与测量 (D) 数学模型准确值与实际值 3.用 1+x近似表示e x所产生的误差是( )误差。 (A). 模型 (B). 观测 (C). 截断 (D). 舍入 4.用s*=g t2表示自由落体运动距离与时间的关系式 (g为重力加速度),s t是在时间t内的实际距离,则s t s*是()误差。 (A). 舍入 (B). 观测 (C). 模型 (D). 截断 5.作为的近似值,有( )位有效数字。 (A) 3; (B) 4; (C) 5; (D) 6。

四、计算题 1.,,分别作为的近似值,各有几位有效数字? 2.设计算球体积允许的相对误差限为1%,问测量球直径的相对误差限最大为多少? 3.利用等价变换使下列表达式的计算结果比较精确: (1), (2) (3) , (4) 4.真空中自由落体运动距离s与时间t的关系式是s=g t2,g为重力加速度。现设g是精确的,而对t有秒的测量误差,证明:当t增加时,距离的绝对误差增加,而相对误差却减少。 5*. 采用迭代法计算,取 k=0,1,…, 若是的具有n位有效数字的近似值,求证是的具有2n位有效数字的近似值。 练习题二 一、是非题 1.单点割线法的收敛阶比双点割线法低。 ( ) 2.牛顿法是二阶收敛的。 ( ) 3.求方程在区间[1, 2]内根的迭代法总是收敛的。( ) 4.迭代法的敛散性与迭代初值的选取无关。 ( ) 5.求非线性方程f (x)=0根的方法均是单步法。 ( ) 二、填空题

宋词题库及参考答案

宋词测试题 一、填空题 1 2 3 4、细看来,不是杨花,点点是离人泪 5、绿杨烟外晓寒轻,红杏枝头春意闹 6 7、青山遮不住,毕竟东流去 8、斜阳草树,寻常巷陌,人道寄奴曾住。 9、莫道不消魂,帘卷西风,人比黄花瘦 10、沙上并禽池上暝,云破月来花弄影。 11、碧云天,黄叶地。秋色连波,波上寒烟翠。 12、平芜尽处是春山,行人更在青山外 13 14 15 16 17 18 19 20、柔情似水,佳期如梦, 21 22、试问闲愁都几许?一川烟草,满城风絮,梅子黄时雨。 23、为君持酒劝夕阳,且向花间留晚照。 24

25 26 27 28 29、词的句式大多不整齐,长长短短,所以词又称长短句 30 31、 32、“柳三变”是指柳永。 33、辛弃疾《摸鱼儿》被梁启超评为“回肠荡气,前无古人,后无来者”的作品。 34、北宋的晏殊被称为富贵词人 35 36 37、“六一居士”是指欧阳修 38、《漱玉词》的作者是李清照 39 40、宋代的中秋词,可以与苏轼的《水调歌头》(明月几时有)相媲美的是张孝祥的《过洞庭》。 二、选择题 1、“红杏尚书”是指( D ) A、欧阳修 B、柳永 C、周邦彦 D、宋祁 2、下列句中划横线词的解释不全对的一组是( b ) A、缥缈孤鸿影鸿:大雁。有恨无人省省:理解。 B、今宵剩把银釭照剩:同“侭”,只管。一一风荷举举:全。 C、贺兰山缺缺:山口。自度此曲度:创制。

D、可怜无数山可怜:可惜。爱上层楼层楼:高楼 3、陆游给前妻唐琬的《钗头凤》是写在( A ) A、墙壁上 B、手帕上 C、信笺上 D、诗笺上 4、下列词语中加点的字的读音,全都正确的一组是(B ) A、征帆去棹(zhào)低绮(yí)户 B、羽扇纶(guān)巾笑靥(yè) C、滂(pāng)沱憔(jiāo)悴损 D、荠麦(jì)怆然(pò)) 5、下面均是摘自宋代词人的词句,请按词人词风选出分类正确的一组(D ) ①衣带渐宽终不悔,为伊消得人憔悴。②青山遮不住,毕竟东流去。③人有悲欢离合,月有阴晴圆缺,此事古难全。④纵豆蔻辞工,青楼梦好,难赋深情。⑤昨夜雨疏风骤,浓睡不消残酒。⑥三十功名尘与土,八千里路云和月。 A、①③⑥/②④⑤ B、①②③⑤/④⑥ C、①③④/②⑤⑥ D、 ①④⑤/②③⑥ 6、对下列诗句的赏析不正确的一项是( A ) A、“宝马雕车香满路”描述了有钱人家的奢侈糜烂、寻欢作乐的生活。 B、“烟柳画桥,风帘翠幕,参差十万人家”,这一句从各个角度描写杭州之形胜与繁华。“烟柳画桥”,写街巷河桥的美丽;“风帘翠幕”,写居民住宅的雅致;“参差十万人家”,表现出整个都市户口的繁庶。 C、“玉壶光转,一夜鱼龙舞”,表现了元宵欢娱、彻夜歌舞的热闹景象。 D、“寻寻觅觅,冷冷清清,凄凄惨惨戚戚”,用一连串叠字写主人公一整天的愁苦心情,从一起床便百无聊赖,如有所失,于是东张

算法设计与分析习题答案1-6章

习题1 1. 图论诞生于七桥问题。出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在 叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图是这条河以及河上的两个岛和七座桥的草图。请将该问题的数据模型抽象出来,并判断此问题是否有解。 七桥问题属于一笔画问题。 输入:一个起点 输出:相同的点 1, 一次步行 2, 经过七座桥,且每次只经历过一次 3, 回到起点 该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。另一类是只有二个奇点的图形。 2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。请用伪代码描述这个版本的欧几里德算法 =m-n 2.循环直到r=0 m=n n=r r=m-n 图 七桥问题 南区

3 输出m 3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。要求分别给出伪代码和C++描述。 编写程序,求n至少为多大时,n个“1”组成的整数能被2013整除。 #include using namespace std; int main() { double value=0; for(int n=1;n<=10000 ;++n) { value=value*10+1; if(value%2013==0) { cout<<"n至少为:"< using namespace std; int main () {

《管理运筹学》第四版课后习题解析(下)

《管理运筹学》第四版课后习题解析(下) 第9章 目 标 规 划 1、解: 设工厂生产A 产品1x 件,生产B 产品2x 件。按照生产要求,建立如下目标规划模型。 112212121211122212min ()() s.t 43452530 555086100 ,,,0,1,2 -- +-+-+-++++-+=+-+==i i P d P d x x x x x x d d x x d d x x d d i ≤≤≥ 由管理运筹学软件求解得 12121211.25,0,0,10, 6.25,0x x d d d d --++ ====== 由图解法或进一步计算可知,本题在求解结果未要求整数解的情况下,满意解有无穷多个,为线段(135/14,15/7)(1)(45/4,0),[0,1]ααα+-∈上的任一点。 2、解: 设该公司生产A 型混凝土x 1吨,生产B 型混凝土x 2吨,按照要求建立如下的目标规划模型。 ) 5,,2,1(0,,0,0145 50.060.015550.040.030000100150100 120275200.)()(min 2121215521442331222111215443 32 211 1 =≥≥≥≤+≤+=-++=-+=-+=-++=-++++++++-+-+-+-+-+-- - - + +- i d d x x x x x x d d x x d d x d d x d d x x d d x x t s d p d d p d p d d p i i 由 管 理 运 筹 学 软 件 求 解 得 . 0,0,20,0,0,0, 0,35,40,0,120,120554433221121============+-+-+-+-+-d d d d d d d d d d x x

最新大学语文题库及参考答案【精选】

大学语文2016年备考题库 一、作家作品知识 1. 下列作家中,被列为明代“后七子”之一的是() A.冯梦龙 B.侯方域 C.宗臣 D.顾秉谦 2. 李煜《虞美人》“雕栏玉砌应犹在,只是朱颜改”的言外之意是() A.美景依旧,故人已老 B.岁月流逝,青春不再 C.故国宫殿,令人牵挂 D.江山易主,物是人非 3. 《马伶传》的“马伶”在《鸣凤记》中扮演的是() A.严嵩 B.杨继盛 C.夏言 D.顾秉谦 4. 《马伶传》在叙述“马伶和李伶第二次较量”时所用的方法是() A.倒叙 B.顺序 C.插叙 D.分叙 5. 《行路难》中具有象征意义的诗句是() A.停杯投箸不能食,拔剑四顾心茫然 B.欲渡黄河冰塞川,将登太行雪满山 C.闲来垂钓碧溪上,忽复乘舟梦日边 D.长风破浪会有时,直挂云帆济沧海 6. 柳永《八声甘州》中表达思归情感委婉曲折的词句是() A.对潇潇暮雨洒江天,一番洗清秋 B.惟有长江水,无语东流 C.不忍登高临远,望故乡渺邈,归思难收 D.想佳人妆楼颙望,误几回,天际识归舟 7. “宝玉挨打”的多种因素中,最终激怒贾政痛打宝玉的直接原因是( ) A.贾环的进谗 B.金钏儿投井 C.贾雨村的挑唆 D.忠顺王府索人 8. 《报刘一丈书》中的“权者”暗指() A.刘一丈 B.宗臣 C.顾秉谦 D.严嵩 9. 苏轼《前赤壁赋》行文叙述的外显过程是() A.时间的推移 B.感情的变化 C.事理的逻辑 D.想象的展开 10. 李白《行路难》(其一)中使用比喻手法来表现诗人仕途上遭遇挫折的诗句是() A.停杯投箸不能食,拔剑四顾心茫然 B.欲渡黄河冰塞川,将登太行雪满山 C.闲来垂钓碧溪上,忽复乘舟梦日边 D.长风破浪会有时,直挂云帆济沧海 11. 下列作家,提出“明道、致用、事信、言文”写作主张的是()

计算机算法设计与分析习题及答案

计算机算法设计与分析习 题及答案 Prepared on 24 November 2020

《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是(A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是(B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是( D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是(A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是(D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先

10.下列算法中通常以深度优先方式系统搜索问题解的是(D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 11.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为(B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是(B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是(B)。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是(A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是(C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略(B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 19. (D)是贪心算法与动态规划算法的共同点。

相关主题
文本预览
相关文档 最新文档