program s401; var p,q:array[0..5] of integer; i,x,y:integer; begin y:=20;

34
program s401; var p,q:array[0..5] of integer; i,x,y:integer; begin y:=20; for i:=0 to 4 do read(p[i]); readln; q[0]:=(p[0]+p[1])+(p[2]+p[3]+p[4]) div 7; q[1]:=p[0]+p[1] div ((p[2]+p[3]) div p[4]); q[2]:=p[0]*p[1] div p[2]; q[3]:=q[0]*q[1]; q[4]:=q[1]+q[2]+q[3]; x:=(q[0]+q[4]+2)-p[(q[3]+3) mod 4]; if (x>10) then y:=y+(q[1]*100-q[3]) div (p[p[4] mod 3]*5) else y:=y+20+(q[2]*100-q[3]) div (p[p[4] mod 3]*5); writeln(x,',',y); end. 第第第第第

Upload: gin

Post on 13-Jan-2016

47 views

Category:

Documents


0 download

DESCRIPTION

program s401; var p,q:array[0..5] of integer; i,x,y:integer; begin y:=20; for i:=0 to 4 do read(p[i]); readln; q[0]:=(p[0]+p[1])+(p[2]+p[3]+p[4]) div 7; q[1]:=p[0]+p[1] div ( ( p[2]+p[3] ) div p[4] ) ; q[2]:=p[0]*p[1] div p[2]; q[3]:=q[0]*q[1]; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

program s401;var p,q:array[0..5] of integer; i,x,y:integer;begin y:=20; for i:=0 to 4 do read(p[i]); readln; q[0]:=(p[0]+p[1])+(p[2]+p[3]+p[4]) div 7; q[1]:=p[0]+p[1] div ((p[2]+p[3]) div p[4]); q[2]:=p[0]*p[1] div p[2]; q[3]:=q[0]*q[1]; q[4]:=q[1]+q[2]+q[3]; x:=(q[0]+q[4]+2)-p[(q[3]+3) mod 4]; if (x>10) then y:=y+(q[1]*100-q[3]) div (p[p[4] mod 3]*5) else y:=y+20+(q[2]*100-q[3]) div (p[p[4] mod 3]*5); writeln(x,',',y);end./* 注:本例中,给定的输入数据可以避免分母为 0 或下标越界。输入: 6 6 5 5 3

第十三届第一题

Page 2: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

数的码制

Page 3: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

88 位带符号数:位带符号数:

DD77 D D66 D D55 D D44 D D33 D D22 D D11 D D00

符号位符号位 数值位数值位

DD77 = =

00 正数正数

11 负数负数

机器数机器数 真值真值01010010B01010010B == +82+82

11010010B11010010B == 8282

Page 4: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

二、带符号数的三种表示方法二、带符号数的三种表示方法

1. 原码

最高位为符号位0 正数1 负数

[+4] 原 = 0 000 0100B

[4] 原 = 1 000 0100B

后面 n-1 位是数值。

Page 5: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

原码的特点:原码的特点:

(1) 数值部分即为该带符号数的二进制值。

(2) “0” 有 +0 和 - 0 之分,若字长为八位, 则: (+0) 原= 0 0000000 , (–0) 原= 1 0000000

(3) 8 位二进制原码能表示的数值范围为: 01111111 ~ 11111111 ,即 +127 ~– 127 。

Page 6: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

2. 反码

[+5] 原 = [+5] 反 = 0 000 0101B

[5] 原 = 1 000 0101B

正数的反码与其原码相同。

负数的反码除符号位外将原码求反。

[5] 反 = 1 111 1010B

Page 7: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

反码的特点:反码的特点:

(1) “0” 有 +0 和 -0之分。

(2) 8 位二进制反码所能表示的数值范围为 +127 ~–127 , 一般地,对于 n 位字长的计算机来说,其反码表示的数值范围为 +2n-1–1 ~– 2n-1+1 。

(3) 8 位带符号数用反码表示时,若最高位为“ 0”(正数) 则后面的 7 位即为数值;若最高位为“ 1”(负数), 则后面 7 位表示的不是此负数的数值,必须把它们按 位取反,才是该负数的二进制值。

[5] 反 = 1 111 1010B

Page 8: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

3. 补码

[5] 原 = 1000 0101B

正数的补码与其原码相同。

负数的补码是其反码 +1 ,即相应正数按位求反后在末位加 1 。

[5] 反 = 1111 1010B

[5] 补 = 1111 1011B

已知原码求补码是取反加一,已知补码求原码依然是取反加一(符号位不变)

0 取反加 1 试试

Page 9: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

补码的特点:补码的特点:

(1) [+0] 补= [–0] 补= 00000000 ,无 +0 和– 0 之分。

(2) 正因为补码中没有 +0 和– 0 之分,所以 8 位二进制补码所能表示的数值范围为 +127 ~– 128 ;同理可知, n 位二进制补码表示的范围为+2n-1–1 ~– 2n-1 。在原码、反码和补 码三者中,只有补码可以表示– 2n-1 。

(3) 一个用补码表示的二进制数,当为正数时,最高位 ( 符号位 )为“ 0” ,其余位即为此数的二进制值;当为负数时,最高位 ( 符号位 ) 为“ 1” ,其余位不是此数的二进制 值,必须把它们按位取反,且在最低位加 1 ,才是它的二进制值。

补码中 1000 0000 代表 -128

Page 10: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

原码:最高位为符号位,“ 0” 表示正,“ 1” 表示负,其余位表示数值的大小。

反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码:正数的补码与其原码相同;负数的补码是在其反码的末位加 1 ,符号位除外。

Page 11: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

为什么要设立补码呢? 第一是为了能让计算机执行减法: [a-b] 补 =a 补 + ( -b )补 第二个原因是为了统一正 0 和负 0

0 原码是 00000000

-0 原码是 10000000

这两个数其实都是 0 ,但他们的原码却有不同的表示。 0 反码是 00000000

-0 反码是 11111111

0 补码是 00000000

-0 补码是 00000000

特别注意补码中 1000 0000 代表 -128

假设机器能处理的位数为 8. 即字长为 1byte, 原码能表示数值的范围为

(-127~-0 +0~127) 共 256 个 .

在补码中用 (-128) 代替了 (-0), 所以补码的表示范围为 :

(-128~0~127) 共 256 个 .

Page 12: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

补码的加法规则:

[x + y] 补 = [x] 补 + [y] 补

[x - y] 补 = [x] 补 + [ - y] 补

补码的减法规则:

Page 13: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

例 . 计算 y = 99 58 ( 用 8 位二进制表示 )

99 58 = 99 + ( 58)=41

[y] 补 = [99 58] 补 = [99] 补 + [ 58] 补

01100011[99] 补

+ 11000110[ 58] 补

[99] 补 = 0110 0011B

[ 58] 补 = 1100 0110B

y = [y] 补 = 0010 1001B = 41

1 00101001[41] 补

自动丢失

Page 14: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

例 . 机器字长为 8 位。

25– 32

[25] 补 = 0001 1001B [ 32] 补 =1110 0000B

十进制

– 7 [ 7] 补 =1111 1001B

二进制

0001 10011110 0000

1111 1001+

– 57

– 25– 32

[ 25] 补 = 1110 0111B

[ 32] 补 =1110 0000B

[57] 补 =1100 0111B

1110 01111110 0000

1 1100 0111+

自动丢失

Page 15: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

4. 溢出的概念

8 位二进制补码表示数的范围: 128 ~ +127

n位二进制补码表示数的范围: 2n1 ~ +(2n1 1)

若运算结果超过了字长一定的机器所能表示数的范围,称为溢出。此时运算结果出错。

Page 16: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

例 1.

令令 CCSS 为数值部分向符号位的进位,为数值部分向符号位的进位, CCS+1S+1 为符号位为符号位

向高位的进位,此例中向高位的进位,此例中 , , CCSS == CCS+1S+1 == 00 ,结果在,结果在 88 位位

二进制补码表示范围内,二进制补码表示范围内,没有溢出没有溢出。。

00001111

01110000+

01111111

+15

+112

+127

00

CS+1

CS

Page 17: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

例 2.

此例中,此例中, CCss≠≠CCS+S+ 11 ,,产生了错误的结果,产生了错误的结果,发发

生了溢出。生了溢出。

01111110

00000101+

10000011

+126

+5

125

01

CS+1

CS

Page 18: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

01111111

00000101+

10000100

+127

+5

124

例 3.

CS = 1, CS + 1 = 0, 结果溢出!

结果出错。

Page 19: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

10000100

11111011+

01111111 +127

5

124 例 4.

CS = 0, CS + 1 = 1, 结果溢出!

1

因为 CS = CS + 1, 则结果正确。 CS CS + 1, 则结果溢出。

所以 溢出 = CS CS + 1

结果出错。

Page 20: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

综上所述 , 对计算机而言 , 补码的引入使带符号数的运算都按加法处理。如果 C S和 Cs+1 的值相等 , 则表示运

算结果正确 , 没有溢出 , 运算结果的正与负由符号位决定;如果 CS 和 Cs+1 的值不等 , 则表示运算结果不正确 , 发

生了溢出现象。 在计算机中 , 常用“异或”电路来判别有无溢出发生 , 即 CSCs+1 = 1 表示有溢出发生 , 否则无

溢出发生。

Page 21: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

1 、 Tg16 14. 在整数的补码表示法中,以下说法正确的是( AC )。A .只有负整数的编码最高位为 1B .在编码的位数确定后,所能表示的最小整数和最大整数的绝对值相同C .整数 0 只有一个唯一的编码D .两个用补码表示的数相加时,若在最高位产生进位,则表示运算溢出

2 、 [x] 补码 =10011000 ,其原码为 (B )A.011001111 B.11101000 C.11100110 D.01100101提示:已知原码求补码是取反加一,已知补码求原码依然是取反加一(符号位不变)

3 、下列关于十进制数 100 的正确说法是 ( ABD ) 。原码为 01100100B B. 反码为 64H C. 反码为 9BH D. 补码为 64H

4 、关于“ 0” 的原码、反码和补码描述正确的是( C ) A.“0” 的原码只有一种表示方法 B.“0” 的反码只有一种表示方法 C.“0” 的补码只有一种表示方法 D.“0” 的原码、反码和补码均有两种表示方法

Page 22: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

数的存储

Page 23: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

一、数的定点和浮点表示

计算机在处理数据时,要考虑到小数点的位置。如果将小数点固定在某一位置,则称为定点表示;如果小数点可以任意移动,则称为浮点表示。

1 .数的定点表示法——定点小数和定点整数

⑴ 定点小数格式:小数点的位置固定在最高数据位的左边,小数点前面再设一位符号位。

任何 m 位二进制小数在计算机中用 m+1 位二进制表示。

由于小数点总是在符号位与最高数据位之间,因此在计算机中不明确表示出来

0.1011

Page 24: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

⑵ 定点整数格式:小数点位置固定在最低数据位的右边。

整数又分为带符号和不带符号的两类。

带符号的整数,符号位安排在最高(最左)位。

由于小数点固定在最低数据右边,因此在计算机中不明确表示出来。 n 位带符号整数 N=NsNn-1…Nn-2N1N0 在计算机中用 n+1 位二进制表示。

对于不带符号的整数,把所有 n+1 位二进制位全部视为数值。

在不同计算机中,使用多种位数的整数。 16 位, 32 位, 64 位, 64 位二进制来表示一个整数。

1101

Page 25: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

2 .数的浮点表示法

浮点数是指小数点数据中的位置可以左右移动的数。一个数 N 要用浮点数表示可以写: N=M*RE

M :浮点数的尾数。 E :浮点数的指数或阶码。

R :浮点数的基数,是常数一般取 2 、 8 或 16

一旦机器的浮点部件设计好了,基数的大小也就确定了,不能再改变了,基数在浮点数表示中不出现,是隐含的。

⑴ 浮点数的表示方法:

M :尾数。用定点小数表示,表示浮点数的有效位,其位数 n 的大小决定了浮点数的精度。

E :阶码。用定点整数表示。阶码用于表示小数点在浮点数中的位置。其位数m 的大小反映此浮点数所能表示的数的范围。

1101.11=0.110111*24

Page 26: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

数字与字符的编码

一、数字的编码( BCD 码)一、数字的编码( BCD 码)

BCD 码是一种常用的数字编码。

BCD 码: Binary-Coded Decimal ,即二进制

编码的十进制数。用 [… ]BCD 表示。

这种编码法分别将每位十进制数字编成这种编码法分别将每位十进制数字编成 44 位位 二进制代码,从而用二进制数来表示十进制数。 二进制代码,从而用二进制数来表示十进制数。

Page 27: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

[0100 1001 0001.0101 1000]BCD = 491.58

0100 0011B = 67D = [0110 0111]BCD

BCD 码与二进制之间通常要经过十进制实现相互转换。

例 例 例 例

Page 28: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

1. BCD 码 -十进制数的二进制编码

十进制数 8421 码 2421 码 余 3 码

0 0000 0000 0011

1 0001 0001 0100

2 0010 0010 0101

3 0011 0011 0110

4 0100 0100 0111

5 0101 1011 1000

6 0110 1100 1001

7 0111 1101 1010

8 1000 1110 1011

9 1001 1111 1100

Page 29: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

2. 格雷码( Gray Code)

十进制数 格雷码 十进制数 格雷码0 0000 8 1100

1 0001 9 1101

2 0011 10 1111

3 0010 11 1110

4 0110 12 1010

5 0111 13 1011

6 0101 14 1001

7 0100 15 1000

四位格雷码的编码表

Page 30: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

格雷码的特点( 1)任意两个相邻数所对应的格雷码之间只有一位不同,其余位都相同。

( 2)为镜像码。 n位格雷码的前、后 2n-1位码字除首位不同(前 2n-1位码字首位为 0,后 2n-1位码字首位为 1),后面各位互为镜像。

01

1位格雷码 0110

0011

00011110

2位格雷码

Page 31: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

3位格雷码

00011110

2位格雷码

1111

0001111010110100

0000

000001011010110111101100

Page 32: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

奇偶校验 计算机中数据在进行存储和传输过程中可能会发生错误。为了及时发现和纠

正这类错误,在数据传输(存储)过程中要进行校验,常用的校验方法就是奇偶校验。

奇偶校验能发现一位或奇数位错误,且不能纠正错误。一般以字节(八位二进制)为单位加 1 位奇偶校验位。奇偶校验分奇校验和偶校验两种。

一、奇校验:一个字节前面加一位校验位使得“ 1” 的个数保持为奇数,若八位二进制数中“ 1” 的个数为偶数,则校验位为“ 1” ;若八位二进制数中“ 1”

的个数为奇数,则校验位为“ 0” 。 【例 1】给 10011001 01101101 加奇校验结果为 110011001 001101101

二、偶校验:一个字节前面加一位校验位使得“ 1” 的个数保持为偶数,若八位二进制数中“ 1” 的个数为偶数,则校验位为“ 0” ;若八位二进制数中“ 1”

的个数为奇数,则校验位为“ 1” 。 【例 2】给 10011001 01101101 加偶校验结果为 010011001 101101101

Page 33: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

3. program S403;var a1:array[1..50] of integer; i,j,t,t2,n,n2:integer;begin n:=50; for i:=1 to n do a1[i]:=0; n2:=round(sqrt(n)); for i:=2 to n2 do if(a1[i]=0) then begin t2:=n div i; for j:=2 to t2 do a1[i*j]:=1; end; t:=0; for i:=2 to n do if (a1[i]=0) then begin write(i:4); inc(t); if(t mod 10=0) then writeln; end; writeln; end.输出:

Page 34: program s401; var p,q:array[0..5] of integer;       i,x,y:integer; begin    y:=20;

129,43