1、第 十 二 届 全 国 青 少 年 信 息 学 奥 林 匹 克 联 赛 初 赛 试 题( 提高组 C 语言 二 小 时 完 成 ) 全 部 试 题 答 案 均 要 求 写 在 答 卷 纸 上 , 写 在 试 卷 纸 上 一 律 无效 一 、 单 项 选 择 题 ( 共 10题 , 每 题 1.5分 , 共 计 15分 。 每 题 有 且 仅 有 一 个 正 确 答 案 .) 。1. 在 以 下 各 项 中 。 ( ) 不 是 CPU的 组 成 部 分 。A. 控 制 器 B. 运 算 器 C . 寄 存 器 D. ALU E. RAM2. BIOS( 基 本 输 入 输 出 系 统 ) 是 一
2、 组 固 化 在 计 算 机 内 ( ) 上 一 个 ROM芯 片上 的 程 序 。A. 控 制 器 B. CPU C. 主 板 D . 内 存 条 E. 硬 盘3.在 下 面 各 世 界 顶 级 的 奖 项 中 , 为 计 算 机 科 学 与 技 术 领 域 作 出 杰 出 贡 献 的 科 学 家 设 立 的奖 项 是 ( ) 。A. 沃 尔 夫 奖 B. 诺 贝 尔 奖 C. 菲 尔 兹 奖D. 图 灵 奖 E. 南 丁 格 尔 奖4 在 编 程 时 ( 使 用 任 一 种 高 级 语 言 , 不 一 定 是 C) , 如 果 需 要 从 磁 盘 文 件 中 输 入 一 个 很 大 的二
3、维 数 组 ( 例 如 1000*1000的 double型 数 组 ) , 按 行 读 ( 即 外 层 循 环 是 关 于 行 的 ) 与 按列 读 ( 即 外 层 循 环 是 关 于 列 的 ) 相 比 , 在 输 入 效 率 上 ( ) 。A. 没 有 区 别 B. 有 一 些 区 别 , 但 机 器 处 理 速 度 很 快 , 可 忽 略 不 计C. 按 行 读 的 方 式 要 高 一 些 D . 按 列 读 的 方 式 要 高 一 些 E. 取 决 于 数 组的 存 储 方 式 。5 在 C语 言 中 , 表 达 式 212的 值 是 ( ) 由 OIF 收集A. 441 B. 42
4、 C.23 D.24 E.256 在 C语 言 中 , 判 断 a不 等 于 0且 b不 等 于 0的 正 确 的 条 件 表 达 式 是 ( )A. !a=0 | !b=0 B. !(a=0)for(i=0;i10)由 OIF 收集y+= (v2*100-v3)/(uu0%3*5);elsey+=20+(v2*100-v3)/(uv0%3*5);printf(“%d,%dn“, x,y);return 0; /*注 : 本 例 中 , 给 定 的 输 入 数 据 可 以 避 免 分 母 为 0或 下 标 越 界 。 */输 入 : 9 3 9 4输 出 : _2 #include main(
5、)int i,j,m=2,3,5,7,13;long t;for (i=0;i0) j-;return j;int fun2(char s,char a,int n)由 OIF 收集int j;j=1;while(asj if(m1)digit(n/10,m/10);printf(“%2ld“,n%10);main()long x,x2;printf(“Input a number:n“); scanf(“%ld“,x2=1;while(x2 int n,k,a10; long count=0;void perm2(int j)int i,p,t;if( )for(i=k;i4-2-1-5-3
6、。 遗 传 算 法 的 核 心 是 通 过 两 个 个 体 的 交 叉 操 作 , 产 生 两 个 新 的 个 体 。 下 面 的 程 序给 出 了 最 简 单 的 一 种 交 叉 算 法 。 具 体 过 程 如 下 :(1)选 定 中 间 一 段 作 为 互 换 段 , 该 段 的 起 止 下 标 为 t1, t2, 随 机 生 成 t1, t2后 ,互 换 两 段 。(2)互 换 后 , 在 每 个 新 的 排 列 中 可 能 有 重 复 数 字 , 因 而 不 能 作 为 新 个 体 的 编 码 , 一 般再 做 两 步 处 理 :(2.1) 将 两 个 互 换 段 中 , 共 同 的
7、数 字 标 记 为 0, 表 示 已 处 理 完 。(2.2) 将 两 个 互 换 段 中 其 余 数 字 标 记 为 1, 按 顺 序 将 互 换 段 外 重 复 的数 字 进 行 替 换 。 例 如 : n=12, 两 个 个 体 分 别 是 : 由 OIF 收集a1: 1 3 5 4 * 2 6 7 9 * 10 12 8 11a2: 3 2 1 12 * 6 7 10 11 * 8 5 4 9 t1=5, t2=8。 上 述 每 一 行 中 ,两 个 星 号 间 的 部 分 为 互 换 段 。 假 定 数 组 的 下 标 从 1开 始 , 互 换 后 有 : a1: 1 3 5 4 *
8、 6 7 10 11 * 10 12 8 11a2: 3 2 1 12 * 2 6 7 9 * 8 5 4 9 然 后 , 将 数 字 6,7对 应 的 项 标 记 为 0, 星号 内 数 字 2,9,10,11对 应 的 项 标 记 为 1, 并且 按 顺 序 对 应 关 系 为 :102, 119。 于 是 ,将 a19=10替 换 为 a19=2, 将 a22=2替换 为 a22=10,类 似 再 做 第 2组 替 换 。 这 样 处 理 后 , 就 得 到 了 两 个 新 个 体 :a1: 1 3 5 4 6 7 10 11 2 12 8 9a2: 3 10 1 12 2 6 7 9
9、8 5 4 11( 3) 输 出 两 个 新个 体 的 编 码 。 程序 :#include #include #define N 20int a1N,a2N,kz1N,kz2N, n;int rand1(int k)int t=0;while(tk)t=(int)(double)rand()/RAND_MAX*k);return t;void read1(int a,int m)读 入 数 组 元 素 a1至 am, a0=0, 略 。 void wrt1(int a,int m)输 出 数 组 元 素 a1至 am, 略 。 void cross(int a1, int a2,int t1, int t2, int n)int i,j,k,t,kj;for(i=t1; it2)kz1i=kz2i=-1;else ;for(i=t1;i=t2;i+)for(j=t1;j=t2;j+)if(a1i=a2j) ; b reak;for(i=t1;i=t2;i+)if(kz1i=1)for(j=t1;j=t2;j+)if(kz2j=1)kj=j; break;for(j=1;j=n;j+)