c程序设计第三版习题参考解答(全)

上传人:gbs****77 文档编号:9287436 上传时间:2020-04-04 格式:DOC 页数:116 大小:509.34KB
返回 下载 相关 举报
c程序设计第三版习题参考解答(全)_第1页
第1页 / 共116页
c程序设计第三版习题参考解答(全)_第2页
第2页 / 共116页
c程序设计第三版习题参考解答(全)_第3页
第3页 / 共116页
点击查看更多>>
资源描述
1 C 程序设计 第三版 课后习题参考解答 第 1 章 C 语言概述 1 5 参照本章例题 编写一个 C 程序 输出以下信息 Very Good 解 main printf n printf n printf Very Good n printf n printf n 1 6 写一个程序 输入 a b c 三个值 输出其中最大者 解 main int a b c max printf 请输入三个数 a b c n scanf d d d max a if max b max b if max c max c printf 最大数为 d max 第 2 章 程序的灵魂 算法 2 1 什么叫结构化的算法 为什么要提倡结构化的算法 解 由一些基本结构顺序组成的算法称为结构化的算法 由于在基本结构之间不存在非顺 序的跳转 流程的转移只存在于一个基本结构范围之内 因而提高了算法的质量 2 7 什么叫结构化程序设计 它的主要内容是什么 解 结构化程序就是用高级语言表示的结构化算法 它的主要内容包括 自顶向下 逐步 细化 的分析方法和 模块化设计 的解决方法 以及 结构化编码 的实现方法 第 3 章 数据类型 运算符与表达式 3 4 将以下三各整数分别赋给不同类型的变量 请画出赋值后数据在内存中的存储形式 注 如果没有学过二进制和补码 此题可以不做 解 各数据在内存中的存储形式如下表所示 变量的类型 25 2 32769 int 型 00 000011001 8 位 1111111111111110 15 100 001 溢出 2 14 long 型 00 000011001 24 11 1110 31 00 0100 001 16 14 short 型 100 000011001 8 1111111111111110 15 100 001 溢出 14 signed char 8 位 100011001 11111110 00000001 溢出 unsigned int 型 00 000011001 8 11 110 15 100 001 14 unsigned long 型 00 000011001 24 11 110 31 00 0100 001 16 14 unsigned short 型 00 000011001 8 11 110 15 100 001 8 unsigned char 型 00011001 11111110 00000001 其中 int 和 short 类型 其取值范围是 32768 32767 32769 在这两种类型中实际表示负 数 它是一个负数的补码 对其再求一次补码可得其真值 即 65536 32769 32767 char 和 unsigned char 为 8 位 若将 int 或 long 类型数据赋给这种类型 则截取数据低 8 位 同理 若将 long 赋给 int 则截取低 16 位 3 5 字符常量和字符串常量有什么区别 解 字符常量是一个字符 用单引号括起来 字符串常量是由 0 个或若干个字符组合而成 用双引号括起来 存储时自动在字符串最后加一个结束符号 0 3 6 写出以下程序运行的结果 main char cl a c2 b c3 c c4 101 c5 116 printf a c b c t c c t abc n c1 c2 c3 printf t b c c c4 c5 解 程序运行的结果为 aa bb cc abc A N 3 7 要将 China 译成密码 密码规律是 用原来的字母后面第 4 个字母代替原来的字 母 例如 字母 A 后面第 4 个字母是 E 用 E 代替 A 因此 China 应译 为 Glmre 请编一程序 用赋初值的方法使 c1 c2 c3 c4 c5 这 5 个变量的值分别为 C h i n a 经过运算 使 c1 c2 c3 c4 c5 的值分别变为 G l m r e 并输出 解 main char cl C c2 h c3 i c4 n c5 a c1 4 c2 4 c3 4 c4 4 3 c5 4 printf 密码是 c c c c c n c1 c2 c3 c4 c5 运行结果 密码是 Glmre 3 8 例 2 6 能否改成如下 main int c1 c2 原为 char c1 c2 c1 97 c2 98 printf c c n c1 c2 printf d d n c1 c2 解 可以 因为在可输出的字符范围内 用整型和用字符型作用相同 3 9 求下面算术表达式的值 x a 3 int x y 2 4 设 x 2 5 a 7 y 4 7 float a b 2 int x int y 设 a 2 b 3 x 3 5 y 2 5 解 1 2 5 2 3 5 3 10 写出程序运行的结果 main int i j m n i 8 j 10 m i n j printf d d d d i j m n 解 运行结果为 9 11 9 10 3 11 写出下面赋值的结果 格中写了数值的是要将它赋给其他类型的变量 将所有空格 填上赋值后的数值 int 99 42 char d unsigned int 76 65535 4 float 53 65 long int 68 解 int 99 100 76 53 68 42 1 char c d L 5 D unsigned int 99 100 76 53 68 42 65535 float 99 00 0000 100 0000 00 76 00000 0 53 65 68 000000 42 000000 65535 0000 00 long int 99 100 76 53 68 42 65535 3 12 出下面表达式运算后 a 的值 设原来 a 12 设 a 和 n 都已定义为整型变量 1 a a 2 a 2 3 a 2 3 4 a a a 5 a n 2 n 的值等于 5 6 a a a a 解 1 24 2 10 3 60 4 0 5 0 6 0 第 4 章 最简单的 C 程序设计 顺序程序设计 4 4 若 a 3 b 4 c 5 x 1 2 y 2 4 z 3 6 u 51247 n 128765 c1 a c2 b 想 得到以下的输出格式和结果 请写出程序 包括定义变量类型和设计输出 要求输出的结果如下 a 3 b 4 c 5 x 1 200000 y 2 400000 z 3 600000 x y 3 60 y z 1 20 z x 2 40 u 51247 n 128765 c1 a or 97 ASCII c2 b or 98 ASCII 解 main int a b c long int u n float x y z char c1 c2 a 3 b 4 c 5 x 1 2 y 2 4 z 3 6 u 51247 n 128765 c1 a c2 b printf n printf a 2d b 2d c 2d n a b c printf x 6f y 6f z 6f n x y z printf x y 2f y z 2f z x 2f n x y y z z x 5 printf u 6ld n 9ld n u n printf c1 c or d ASCII n c1 c1 printf c2 c or d ASCII n c2 c2 4 5 请写出下面程序的输出结果 main int a 5 b 7 float x 67 8564 y 789 124 char c A long n 1234567 unsigned u 65535 printf d d n a b printf 3d 3d n a b printf f f n x y printf 10f 10f n x y printf 8 2f 8 2f 4f 4f 3f 3f n x y x y x y printf e 10 2e n x y printf c d o x n c c c c printf ld lo x n n n n printf u o x d n u u u u printf s 5 3s n COMPUTER COMPUTER 运行结果 5 7 5 7 67 856400 789 124023 67 856400 789 124023 67 86 789 12 67 8564 789 1240 67 856400 789 124023 6 785640e 01 7 9e 02 A 65 101 41 1234567 4553207 d687 65535 177777 ffff 1 COMPUTER COM 可以发现 输出数据中若有负号 e 和小数点 这些字符也占位 4 6 用下面的 scanf 函数输入数据 使 a 3 b 7 x 8 5 y 71 82 c1 A c2 a 问在 键盘上如何输入 include void main int a b float x y char c1 c2 scanf a d b d 6 scanf f e scanf c c 解 a 3 b 7 8 5 71 82 A a 4 7 下面的 scanf 函数输入数据 使 a 10 b 20 c1 A c2 a x 1 5 y 3 75 z 67 8 请问在键盘上如何输入数据 scanf 5d 5d c c f f f f 解 main int a b float x y z char c1 c2 scanf 5d 5d c c f f f f printf a d b d c1 5c c2 c x 6 2f y 6 2f z 6 2f n a b c1 c2 x y z 运行情况如下 10 20Aa1 5 3 75 1 5 67 8 此行为输入的数据 其中 为空格 a 10 b 20 c1 A c2 a x 1 50 y 3 75 z 67 80 此行为输出 说明 按 5d 格式的要求输入 a 和 b 时 要先键入三个空格 然后再键入 10 与 20 f 是用来禁止赋值的 在输入时 对应于 f 的地方 随意打入了一个数 1 5 该值不会赋给 任何变量 4 8 圆半径 r 1 5 圆柱高 h 3 求圆周长 圆面积 圆球表面积 圆球体积 圆柱体积 用 scanf 输入数据 输出计算结果 输出时要求有文字说明 取小数点后 2 位数字 请编 程序 解 main float pi h r l s sq vq vz pi 3 1415926 printf 请输入圆半径 r 圆柱高 h n scanf f f l 2 pi r s r r pi sq 4 pi r r vq 3 0 4 0 pi r r r vz pi r r h printf 圆周长为 l 6 2f n l printf 圆面积为 s 6 2f n s printf 圆球表面积为 sq 6 2f n sq 7 printf 圆球体积为 sv 6 2f n vq printf 圆柱体积为 sz 6 2f n vz 运行结果 请输入圆半径 r 圆柱高 h 1 5 3 圆周长为 l 9 42 圆面积为 s 7 07 圆球表面积为 sq 28 27 圆球体积为 sv 7 95 圆柱体积为 sz 21 21 4 9 输入一个华氏温度 要求输出摄氏温度 公式为 C 5 9 F 32 输出要有文字说明 取 2 位小数 解 main float c f printf 请输入一个华氏温度 n scanf f c 5 0 9 0 f 32 注意 5 和 9 要用实型表示 否则 5 9 的值为 0 printf 摄氏温度为 5 2f n c 运行结果 请输入一个华氏温度 78 摄氏温度为 25 56 第 5 章 选择结构程序设计 5 2 语言中如何表示 真 和 假 系统如何判断一个量的 真 和 假 解 设有一个逻辑表达式 若其结果为 真 则以 1 表示 若其结果为 假 则以 0 表 示 但是判断一个逻辑量的值时 以 0 代表 真 以非 0 代表 假 例如 3 printf 请输入 3 个整数 scanf d d d if a b if b c printf max d n c else printf max d n b else if ab a b 将 a 和 b 中的大者存入 temp 中 max temp c temp c 将 a 和 b 中的大者与 c 比较 取最大者 printf 3 个整数中最大数是 d n max 方法三 a b a c a c b c b c 运行结果 请输入 3 个整数 12 34 9 3 个整数的最大数是 34 5 5 有一函数 9 1032xy 写一程序 输入 x 值 输出 y 值 解 程序如下 main int x y printf 输入 x scanf d if x 1 x 1 y x printf x d3d y x d n x y else if x 10 1 x100 score9999 place 5 else if num 999 place 4 else if num 99 place 3 else if num 9 place 2 else place 1 printf place d n place printf 每位数字为 ten thousand num 10000 thousand int num ten thousand 10000 1000 hundred int num ten thousand 10000 thousand 1000 100 ten int num ten thousand 10000 thousand 1000 hundred 100 10 11 indiv int num ten thousand 10000 thousand 1000 hundred 100 ten 10 switch place case 5 printf d d d d d ten thousand thousand hundred ten indiv printf n 反序数字为 printf d d d d d n indiv ten hundred thousand ten thousand break case 4 printf d d d d thousand hundred ten indiv printf n 反序数字为 printf d d d d n indiv ten hundred thousand break case 3 printf d d d hundred ten indiv printf n 反序数字为 printf d d d n indiv ten hundred break case 2 printf d d ten indiv printf n 反序数字为 printf d d n indiv ten break case 1 printf d indiv printf n 反序数字为 printf d n indiv break 运行结果 请输入一个整数 0 99999 98765 位数 5 每位数字为 9 8 7 6 5 反序数字为 56789 5 8 企业发放的奖金根据利润提成 利润 I 低于或等于 10 万元时 奖金可提 10 利润高 于 10 万元 低于 20 万元 100000 I 200000 时 其中 10 万元按 10 提成 高于 10 万 元的部分 可提成 7 5 200000 I 400000 时 其中 20 万元仍按上述办法提成 下同 高于 20 万元的部分按 5 提成 400000 I 600000 时 高于 40 万元的部分按 3 提成 6000001000000 时 超过 100 万的部分 按 1 提成 从键盘输入当月利润 I 求应发放奖金总数 要求 1 用 if 语句编程序 2 用 switch 语句编程序 解 计算利润时 要特别注意不同利润的不同提成比例 例如 利润为 15 万元 其中由 10 万元按 10 的比例提成 另外 5 万元则按 7 5 提成 用 if 语句编程序 main long i float bonus bon1 bon2 bon4 bon6 bon10 bon1 100000 0 1 利润为 10 万元时的奖金 12 bon2 bon1 100000 0 075 利润为 20 万元时的奖金 bon4 bon2 100000 0 05 利润为 40 万元时的奖金 bon6 bon4 100000 0 03 利润为 60 万元时的奖金 bon10 bon6 400000 0 015 利润为 100 万元时的奖金 printf 请输入利润 i scanf ld if i 100000 bonus i 0 1 利润在 10 万元以内按 0 1 提成奖金 else if i 200000 bonus bon1 i 100000 0 075 利润在 10 万至 20 万元时的奖金 else if i 400000 bonus bon2 i 200000 0 05 利润在 20 万至 40 万元时的奖金 else if i 600000 bonus bon4 i 400000 0 03 利润在 40 万元至 60 万元时的奖金 else if i10 then c 10 switch c case 0 bonus i 0 1 break case 1 bonus bon1 i 100000 0 075 break case 2 case 3 bonus bon2 i 200000 0 05 break case 4 case 5 bonus bon4 i 400000 0 03 break 13 case 6 case 7 case 8 case 9 bonus bon6 i 600000 0 015 break case 10 bonus bon10 i 1000000 0 01 printf 奖金是 10 2f bonus 运行结果 请输入利润 i 234000 奖金是 19200 00 5 9 输入 4 个整数 要求按由小到大的顺序输出 解 程序如下 include stdio h void main int t a b c d printf 请输入 4 个整数 scanf d d d d printf a d b d c d d d a b c d if a b t a a b b t if a c t a a c c t if a d t a a d d t if b c t b b c c t if b d t b b d d t if c d t c c d d t printf 排序结果如下 n printf d d d d n a b c d 5 10 有 4 个圆塔 圆心分别为 2 2 2 2 2 2 2 2 圆半径为 1 见图 4 4 这 4 个塔的高度分别为 10m 塔以外无建筑物 今输入任一点的坐标 求该点的 建筑高度 塔外的高度为 0 解 程序如下 main int h 10 float x1 2 y1 2 x2 2 y2 2 x3 2 y3 2 x4 2 y4 2 x y d1 d2 d3 d4 14 printf 请输入一个点 x y scanf f f 求该点到各中心点的距离 d1 x x1 x x1 y y1 y y1 d2 x x2 x x2 y y2 y y2 d3 x x3 x x3 y y3 y y3 d4 x x4 x x4 y y4 y y4 if d1 1 判断该点是否在塔外 printf 该点高度为 d h 运行情况 请输入一个点 x y 0 5 0 7 该点高度为 0 请输入一个点 x y 2 1 2 3 该点高度为 10 第 6 章 循环控制 6 1 输入两个正整数 m 和 n 求其最大公约数和最小公倍数 解 用辗转相除法求最大公约数 main int p r n m temp printf 请输入两个正整数 n m scanf d d if n m temp n n m m temp 把大数放在 n 中 小数放在 m 中 p n m 先将 m 和 n 的乘积保存在 p 中 以便求最小公倍数时用 while m 0 求 m 和 n 的最大公约数 r n m n m m r printf 它们的最大公约数为 d n n printf 它们的最小公倍数为 d n p n p 是原来两个整数的乘积 运行情况 请输入两个正整数 12 8 它们的最大公约数为 4 它们的最小公倍数为 24 15 6 2 输入一行字符 分别统计出其中英文字母 空格 数字和其它字符的个数 解 include main char c int letter 0 space 0 digit 0 other 0 printf 请输入一行字符 n while c getchar n if c a else other printf 字母数 d 空格数 d 数字数 d 其它字符数 d n letter space digit other 运行情况 请输入一行字符 My teacher s address is 123 Beijing Road Shanghai 字母数 38 空格数 6 数字数 3 其它字符数 6 6 3 求 Sn a aa aaa aa a 之值 其中 a 是一个数字 例如 2 22 222 2222 22222 n 个 a 此时 n 5 n 由键盘输入 解 main int a n i 1 sn 0 tn 0 printf a n scanf d d while i n tn tn a 赋值后的 tn 为 i 个 a 组成数的值 sn sn tn 赋值后的 sn 为多项式前 I 项之和 a a 10 i printf a aa aaa d n sn 16 运行情况 a n 2 5 a aa aaa 24690 6 4 求 n 即求 1 2 20 解 main float s 0 t 1 int n for n 1 n 20 n t t n 求 n s s t 将各项累加 printf 1 2 20 e n s 运行结果 1 2 20 2 56133e 18 注意 s 不能定义为 int 型 因为 int 型数据的范围是 32768 32767 也不能定义为 long 型 因为 long 型数据的范围为 21 亿 21 亿 无法容纳求得的结果 6 5 求 105210kk 解 include stdio h include conio h main int n1 100 n2 50 n3 10 k float s1 0 s2 0 s3 0 for k 1 k n1 k s1 k for k 1 k n2 k s2 k k for k 1 k n3 k s3 1 0 k printf sum 8 2f n s1 s2 s3 getch 17 6 6 打印出所有的 水仙花数 所谓 水仙花数 是指一个 3 位数 其各位数字的立方和等于该数本身 例如 153 是一 个 水仙花数 因为 153 13 53 33 解 main int i j k n printf 水仙花数 是 for n 100 n 1000 n i n 100 j n 10 i 10 k n 10 if n i i i j j j k k k printf 4d n printf n 运行结果 水仙花数 是 153 370 371 407 6 7 一个数如果恰好等于它的因子之和 这个数就称为 完数 例如 6 的因子为 1 2 3 而 6 1 2 3 因此 6 是 完数 编程序找出 1000 以内的所有 完数 并按下 面的格式输出其因子 6 Its factors are 1 2 3 解 方法一 define M 1000 定义寻找范围 main int k1 k2 k3 k4 k5 k6 k7 k8 k9 k10 int i a n s for a 2 a M a a 是 2 1000 之间的整数 检查它是否完数 n 0 n 用来累计 a 的因子的个数 s a s 用来存放尚未求出的因子之和 开始时等于 a for i 1 i1 printf d d k1 k2 n 1 表示 a 至少有 2 个因子 if n 2 printf d k3 n 2 表示至少有 3 个因子 故应再输入一个因子 if n 3 printf d k4 以下类似 if n 4 printf d k5 if n 5 printf d k6 if n 6 printf d k7 if n 7 printf d k8 if n 8 printf d k9 if n 9 printf d k10 printf n 运行结果 6 Its factors are 1 2 3 28 Its factors are 1 2 4 7 14 496 Its factors are 1 2 4 8 16 31 62 124 248 方法二 main int m s i for m 2 m 1000 m s 0 for i 1 i m i if m i 0 s s i 19 if s m printf d 是一个 完数 它的因子是 m for i 1 i m i if m I 0 printf d I printf n 方法三 此题用数组方法更简单 main int k 11 int i a n s for a 2 a 1000 a n 0 s a for i 1 i a i if a i 0 n s s i k n i 将找到的因子赋给 k 1 k 10 if s 0 printf n d 是一个 完数 它的因子是 a for i 1 i n i printf d k i printf d n k n 运行结果 6 是一个 完数 它的因子是 1 2 3 28 是一个 完数 它的因子是 1 2 4 7 14 496 是一个 完数 它的因子是 1 2 4 8 16 31 62 124 248 6 8 有一分数序列 2 1 3 2 5 3 8 5 13 8 21 13 求出这个数列的前 20 项之和 解 main int i t n 20 float a 2 b 1 s 0 for i 1 i n i s s a b t a a a b 将前一项分子与分母之和作为下一项的分子 20 b t 将前一项分子作为下一项的分母 printf sum 9 6f n s 运行结果 sum 32 660259 6 9 一球从 100 米高度自由落下 每次落地后反跳回原高度的一半 再落下 求它在第 10 次落地时 共经过多少 m 第 10 次反弹多高 include stdio h void main float sn 100 hn sn 2 int n for n 2 n0 x1 x2 1 2 第一天的桃子数是第二天桃子数加 1 后的 2 倍 x2 x1 day printf total d n x1 运行结果 total 1534 6 11 用迭代法求 21 x 求平方根的迭代公式为 xn 1 a12nxa 要求前后两次求出的 x 的差的绝对值小于 10 5 解 用迭代法求平方根的算法如下 设定一个 x 的初值 x0 用上述公式求出 x 的下一个值 x1 再将 x1 代入上述公式 求出 x 的下一个值 x2 如此继续下去 直到前后两次求出的 x 值 和 xn 1 满足以下关系 n xn 1 10 5n 为了便于程序处理 今只用变量 x0 和 x1 先令 x 的初值 x0 a 2 也可以是另外的值 求 出 x1 如果此时 xn 1 10 5 则使 x1 x0 然后用这个新的 x0 求出下一个 x1 nx 如此反复 直到 xn 1 10 5 为止 程序如下 include main float a x0 x1 printf Enter a positive number scanf f 输入 a 的值 x0 a 2 x1 x0 a x0 2 do x0 x1 x1 x0 a x0 2 while fabs x0 x1 1e 5 printf The square root of 5 2f is 8 5f n a x1 运行结果 Enter a positive number 2 The square root of 2 00 is 1 41421 6 12 用牛顿迭代法求方程 2x3 4x2 3x 6 0 在 1 5 附近的根 解 牛顿迭代法又称牛顿切线法 它采用以下方法求根 先任意设定一个与真实的根接近 的值 x0 作为第一个近似根 由 x0 求出 f x0 过 x0 f x0 点做 f x 的切线 交 x 轴于 x1 把它作为第二次近似根 再由 x1 求出 f x1 再过 x1 f x1 点做 f x 的切线 交 x 轴于 x2 再求出 f x2 再作切线 如此继续下去 直到足够接近真正的 x 为止 22 0 0100 xfxff 因 此 这就是牛顿迭代公式 本题中 f x 2x3 4x2 3x 6 2x 4 x 3 x 6 f x 6x2 8x 3 6x 8 3 include stdio h include math h void main float x1 x0 f f1 x1 1 5 do x0 x1 f 2 x0 4 x0 3 x0 6 f1 6 x0 8 x0 3 x1 x0 f f1 while fabs x1 x0 1e 5 printf THe root of equation is 5 2f n x1 6 13 用二分法求方程 2x3 4x2 3x 6 0 在 10 10 之间的根 解 二分法的思路如下 先指定一个区间 x1 x2 如果函数 f x 在此区间是单调变化 可 以根据 f x1 和 f x2 是否同符号来确定方程 f x 0 在 x1 x2 区间是否有一个实根 若 f x1 和 f x2 不同符号 则 f x 0 在 x1 x2 区间必有一个 且只有一个 实根 若 f x1 和 f x2 同符号 说明在 x1 x2 区间无实根 要重新改变 x1 和 x2 的值 当确定 x1 x2 有一个实根 采用二分法将 x1 x2 区间一分为二 再判断在哪个小区间中有实根 如此不断进行下去 直到小区间足够小为止 算法 N S 图如下 23 直到 fx1 和 fx2 不同符号 输入 x1 和 x2 的值 fx1 f x1 fx2 f x2 直到 fx0 0 do x0 x1 x2 2 fx0 x0 2 x0 4 x0 3 6 if fx0 fx1 1e 5 printf x 6 2f n x0 6 14 打印出以下图案 解 main int I j k for i 0 i 3 i 输出上面 4 行 号 for j 0 j 2 i j printf 输出 号前面的空格 for k 0 k 2 i k printf 输出 号 printf n 输出完一行 号后换行 for i 0 i 2 i 输出下面 3 行 号 for j 0 j i j printf 输出 号前面的空格 for k 0 k 4 2 i k printf 输出 号 printf n 输出完一行 后换行 运行结果 6 15 两个乒乓球队进行比赛 各出 3 人 甲队为 A B C3 人 乙队为 X Y Z3 人 已 抽签决定比赛名单 有人向队员打听比赛名单 A 说他不和 X 比 C 说他不和 X Z 比 请编程找出 3 对赛手的名单 解 用计算机程序处理此问题时 必须对每一种成对的组合一一检验 看他们是否符合条 件 开始时 并不知道 A B C 与 X Y Z 中哪一个比赛 可以假设 A 与 i 比赛 B 与 j 比赛 C 与 k 比赛 include stdio h void main char i j k i 是 A 的对手 j 是 B 的对手 k 是 C 的对手 for i X i Z i for j X j Z j 25 if i j for k X k Z k if i k 第 7 章 数组 7 1 用筛法求 100 之内的素数 解 所谓 筛法 指的是 Eratosthenes 筛法 Eratosthenes 是古希腊的著名数学家 他采 用的方法是 在一张纸上写下 1 1000 之间的全部整数 然后逐个判断它们是否素数 找 出一个非素数就把它挖掉 最后剩下的就是素数 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 41 42 43 44 45 46 47 48 49 50 具体做法如下 先将 1 挖掉 因为 1 不是素数 用 2 去除它后面的各个数 把能被 2 整除的数 如 4 6 8 挖掉 即把 2 的倍数挖掉 用 3 去除它后面各数 把 3 的倍数挖掉 分别用 4 5 各数作为除数去除这些数以后的各数 这个过程一直进行到在除数后面的数 已全被挖掉为止 例如在上表中 1 50 范围内的素数 要一直进行到除数为 47 为止 事实 上 这一过程可以简化 如果需要找 1 n 范围内的素数 只需进行到除数为 取其整n 数 即可 例如对 1 50 只需进行到将 7 即 的整数部分 作为除数即可 50 上面的算法可表示为 挖去 1 用刚才被挖去的数的下一个数 p 去除 p 后面的各数 把 p 的倍数挖掉 检查 p 是否小于 的整数部分 如果 n 1000 则检查 p 31 否 如果是 则返回 2 n 继续执行 否则就结束 纸上剩下的就是素数 解题的基本思路有了 但要变成计算机的操作 还要作进一步的分析 如怎样判断一个数 是否已被 挖掉 怎样找出某一个数 p 的倍数 怎样打印出未被挖掉的数 可以设一个数 组 a a 1 到 a 100 的值分别是 1 2 3 100 然后用上述方法将非素数 挖去 如果 一个数被认为是非素数 就将它的值变为零 最后将不为零的数组元素输出 就是所求的 素数表 程序如下 include main int i j n a 101 for i 1 i 100 i a i i for i 2 i sqrt 100 i 26 for j i 1 j 100 j if a i 0 非素数 赋值为 0 挖掉 printf n for i 2 n 0 i 100 i if a i 0 printf 5d a i n if n 10 此处 if 语句的作用是在输出 10 个数后换行 printf n n 0 运行结果 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 7 2 用选择法对 10 个整数排序 从小到大 解 选择排序的思路如下 设有 10 个元素 a 1 a 10 将 a 1 与 a 2 a 10 比较 若 a 1 比 a 2 a 10 都小 则不进行 交换 即无任何操作 若 a 2 a 10 中有一个以上比 a 1 小 则将其中最小的一个 假设为 a i 与 a 1 交换 此时 a 1 中存放了 10 个中最小的数 第二轮将 a 2 与 a 3 a 10 比较 将剩下 9 个数中的最小者 a i 与 a 2 对换 此时 a 2 中存放的是 10 个中第 2 小的数 依此 类推 共进行 9 轮比较 a 1 到 a 10 就已按由小到大的顺序存放 程序如下 main int i j min a 11 printf Enter data n for i 1 i 10 i printf a d i scanf d 输入 10 个数 printf n for i 1 i 10 i pritnf 5d a i 输出这 10 个数 printf n for i 1 i 9 i 以下 8 行是对 10 个数排序 min i for j i 1 ja j min j a 0 a i 以下 3 行将 a i 1 a 10 中最小者与 a i 对换 a i a min 27 a min a 0 printf n The sorted numbers n for i 1 i 10 i 输出已牌好序的 10 个数 printf 5d a i 运行结果 Enter data a 1 6 a 2 90 a 3 45 a 4 56 a 5 1 a 6 15 a 7 44 a 8 78 a 9 58 a 10 101 6 90 45 56 1 15 44 78 58 101 The sorted number 1 6 15 44 45 56 58 78 90 101 说明 定义 a 数组有 11 个元素 a 0 a 10 但实际上只对 a 1 a 10 这 10 个元素输入值 并排序 这样符合人们的习惯 a 0 用作两数交换时的中间变量 7 3 求一个 3 3 矩阵对角线元素之和 解 main int a 3 3 sum 0 int i j printf Enter data n for i 0 i 3 i for j 0 j 3 j scanf d for i 0 i 3 i sum sum a i i printf sum 5d n sum 运行情况如下 Enter data 1 2 3 4 5 6 7 8 9 sum 15 28 此程序中用的是整型数组 运行结果是正确的 如果用的是实型数组 程序应修改为 main float a 3 3 sum 0 int i j printf Enter data n for i 0 i 3 i for j 0 j 3 j scanf f 注意 在 f 前有一空格 否则无法输入数据 for i 0 i 3 i sum sum a i i printf sum 6 2f n sum 该程序在 Turbo C 3 0 下可正常运行 得到结果 sum 16 50 但在 Turbo C 2 0 环境下运行此程序时 出现运行错误 在输入数据后系统显示出错信息 scanf floating point fomats not linked Abnormal program termination 经过检查 程序的逻辑和语法都是正确的 而且在其它的 C 系统中 例如 Borland C 可以正常运行 出现这种情况是所用的 C 编译系统不完善 处理的方法有两个 一是把程 序移到其它 C 系统上运行 但往往不方便 二是迁就所用的 C 系统 修改程序 避开其 缺陷 这就需要通过多次试验掌握其规律 对以上程序来说 可以有多种替代的方案 例 如可以把程序中第 5 7 行改为 for i 0 i 3 j scanf f f f 它在效果上应与原来的第 5 7 行等价 但上机运行时发现仍不能正常运行 再改为 for j 0 j 3 j scanf f f f 它也是与原来的 5 7 行等价的 上机运行时发现可以正常运行 程序如下 main float a 3 3 sum 0 int i j printf Enter data n for j 0 j 3 j scanf f f f for i 0 i 3 i sum sum a i i printf sum 6 2f n sum 运行情况如下 Enter data 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 应注意数据与元素的对应关系 1 1 是 a 0 0 的值 2 2 是 a 1 0 的值 3 3 是 a 2 0 的 值 29 7 4 有一个已排好序的数组 今输入一个数 要求按原来排序的规律将它插入数组中 解 程序如下 main int a 11 1 4 6 9 13 16 19 28 40 100 注意数组 a 长度应足够大 以便容纳新插入的 元素 int temp1 temp2 number end i j printf array a n for i 0 iend a 10 number else for i 0 inumber 找到合适的插入位置为 i temp1 a i a i number for j i 1 j 11 j 将原来的第 i 个元素移至第 i 1 位置 其它顺序后移 temp2 a j a j temp1 temp1 temp2 break printf Now array a n for i 0 i 11 i printf 6d a i 运行情况如下 array a 1 4 6 9 13 16 19 28 40 100 Insert data 5 Now array a 1 4 5 6 9 13 16 19 28 40 100 加以改进后 可以采用以下方法 30 void main int a 11 1 4 6 9 13 16 19 28 40 100 int temp1 temp2 number end i j printf array a n for i 0 i 0 i 从数组中最后一个数开始比较 凡大于 number 的数向后移动 a i 1 a i a i 1 number 将 number 插入到合适位置 for i 0 i 11 i printf 5d a i printf n 7 5 将一个数组中的值按逆序重新存放 例如原来顺序为 8 6 5 4 1 要求改为 1 4 5 6 8 解 程序如下 define N 5 main int a N i temp printf Enter array a n for i 0 i N i scanf d printf array a n for i 0 i N i printf 4d a i for i 0 i N 2 i temp a i a i a N i 1 a N i 1 temp printf n Now array a n for i 0 i N i printf 4d a i printf n 运行情况如下 Enter array a 8 6 5 4 1 31 array a 8 6 5 4 1 Now array a 1 4 5 6 8 程序中第二个 for 循环也可以写成 for i 0 j N 1 i j i j temp a i a i a j a j temp 7 6 打印出以下的杨辉三角形 要求打印出 10 行 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 解 杨辉三角形是 a b n 展开后各项的系数 例如 a b 0 展开后为 1 系数为 1 a b 1 展开后为 a b 系数为 1 1 a b 2 展开后为 a2 2ab b2 系数为 1 2 1 a b 3 展开后为 a3 3a2b 3ab2 b3 系数为 1 3 3 1 a b 4 展开后为 a4 4a3b 6a2b2 4ab3 b4 系数为 1 4 6 4 1 以上就是杨辉三角形的前 5 行 杨辉三角形各行的系数有以下规律 各行第一个数都是 1 各行最后一个数都是 1 从第 3 行起 除上面指出的第一个数和最后一个数外 其余各数是上一行同列和前一列 2 个数之和 例如第 4 行第 2 个数 3 是第 3 行第 2 个数 2 和第 3 行第 1 个数 1 之和 可以这样表示 a i j a i 1 j a i 1 j 1 其中 i 为行数 j 为列数 define N 11 main int i j a N N for i 1 i N i a i i 1 a i 1 1 for i 3 i N i for j 2 j i 1 j a i j a i 1 j 1 a i 1 j for i 1 i N i for j 1 j i j 32 printf 6d a i j printf n printf n 运行结果 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 7 7 输出魔方阵 所谓魔方阵是指这样的方阵 方阵的阶数应为奇数 它的每一行 每一 列和对角线之和均相等 例如 三阶魔方阵为 294753618 要求输出由 1 n2 之间的自然数构成的魔方阵 解 魔方阵中各数的排列规律如下 将 1 放在第一行中间一列 从 2 开始直到 n n 止各数依次按下列规则存放 每一个数存放的行比前一个数的行数减 1 列数加 1 例如上面的三阶魔方阵 5 在 4 的上一行后一列 如果上一个数的行数为 1 则下一个数的行数为 n 指最下一行 列数同样加 1 例如 1 在第 1 行第 2 列 则 2 应放在最下一行第 3 列 当上一个数的列数为 n 时 下一个数的列数应为 1 行数同样减 1 例如 2 在第 3 行最后一 列 则 3 应放在第 2 行第 1 列 如果按上面规则确定的位置上已经有数 或上一个数是第 1 行第 n 列时 则把下一个数放 在上一个数的下面 例如 按上面的规定 4 应该放在第 1 行第 2 列 但该位置已经被 1 占据 所以 4 就放在 3 的下面 由于 6 是第 1 行第 3 列 即最后一列 故 7 放在 6 的下面 按此方法可以得到任何的魔方阵 void main int a 16 16 i j k p n p 1 33 while p 1 printf Enter n n 1 to 15 scanf d if n 0 初始化 第 0 行和第 0 列不用 与魔方阵构造规则一致 for i 1 i n i for j 1 j n j a i j 0 j n 2 1 a 1 j 1 for k 2 k n n k i j if in i 2 j else if in j 1 if a i j 0 a i j k else i 2 j a i j k 输出魔方阵 for i 1 i n i for j 1 j n j 34 printf 7d a i j printf n system pause 7 8 找出一个二维数组中的鞍点 即该位置上的元素在该行上最大 在该列上最小 也可能 没有鞍点 解 一个二维数组最多有一个鞍点 也可能没有 解题思路是 先找出一行中值最大的元素 然后检查它是否该列中的最小值 如果是 则是鞍点 不需要再找别的鞍点了 输出该鞍 点 如果不是 则再找下一行的最大数 如果每一行的最大数都不是鞍点 则该数 组无鞍点 程序如下 define N 10 define M 10 main int i j k m n flag1 flag2 a N M max maxi maxj printf n 输入行数 n scanf d printf n 输入列数 m scanf d for i 0 i n i printf 第 d 行 n i for j 0 j m j scanf d for i 0 i n i for j 0 j m j printf 5d a i j printf n flag2 0 for i 0 i n i max a i 0 for j 0 jmax max a i j maxj j for k 0 flag1 1 ka k maxj flag 0 if flag1 35 printf n 第 d 行 第 d 列的 d 是鞍点 n i maxj max flag2 1 if flag2 printf n 矩阵中无鞍点 n 运行结果 输入行数 n 3 输入列数 m 4 第 0 行 1 2 3 4 第 1 行 4 5 5 6 第 2 行 3 5 6 7 1 2
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!