|
当前位置:电脑报电子版 > 1999 年 > 22 期 > 软件世界 > 9905请你编程 |
《 9905请你编程 》 |
大家好!《请你编程》又与你们见面了。《请你编程》得到了广大朋友的关心和支持,我在这里表示衷心的感谢!在每次的来稿中,有发电子邮件的,也有寄磁盘稿的,还有直接邮寄稿件的,为了对读者朋友负责,我们都进行了仔细的测试,尽量选出优秀的作品奉献给大家。《请你编程》是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的初学者朋友也参与进来,因为这是一个大家的栏目,“重在参与”是我们的宗旨,无论是对编程高手,还是初学者,我们都会认真对待每一份作品。现在请看本期四川读者汤勇的程序。 9905请你编程解题思路 把核物质记为1,非核物质记为0,则每一种组合可看成一个二进制数。当坑数为i时(i<32),所有核物质与非核物质的组合可看成是二进制整数00...0(i个0)到11...1(i个1)区间的所有二进制整数(包括两个端点),因为该区间的所有二进制整数代表了有i个坑时所有的0、1的组合(对于不足i位的二进制整数前面补0)。把所有这些二进制整数转换成十进制数就是从0到2^(i-1)+2^(i-2)+...+2^1+2^0(2^i-1)之间的所有整数。因此,当坑数为i时,核物质与非核物质的组合共有2^i-1+1=2^i种。 本程序主要采用了函数的递归调用:从i个坑会发生爆炸的组合与i-1个坑会发生爆炸的组合的关系来看,i情况是i-1情况的延伸,即i个坑会发生爆炸的组合总数可由i-1个坑会发生爆炸的组合总数推出。i个坑会发生爆炸的组合总数可分为三种情况: 1.在i-1个坑会发生爆炸的所有组合前面加上0而得,如4个坑会发生爆炸的所有组合1111,1110,0111前加0得01111,01110,00111为5个坑时会发生爆炸的组合; 2. 在i-1个坑会发生爆炸的所有组合前面加上1而得,如4个坑会发生爆炸的所有组合1111,1110,0111前加1得11111,11110,10111为5个坑时会发生爆炸的组合; 3. 在i-1个坑时不会发生爆炸的组合中,前两个数为1,第三个数为0,而第三个数以后又没有三个1连续在一起,此种情况的所有组合前加1而得,如4个坑时这种情况的组合有1100,1101,前加1得11100,11101成为了5个坑时会发生爆炸的组合。 故有:i个坑会发生爆炸的组合总数=( i-1)个坑会发生爆炸的组合总数*2+ (i-4)个坑时不会发生爆炸的组合总数;而(i-4)个坑不会发生爆炸的组合总数=(i-4)个坑的组合总数(即2^(i-4))- (i-4)个坑会发生爆炸的组合总数。 源程序 #include ″stdio.h″ #include ″math.h″ long account(n) int n; { long possible_number;/*该变量求取会发生爆炸的组合总数*/ if (n<3) possible_number=0; else if (n==3) possible_number=1; /*将坑数为3时会发生爆炸的组合总数设为已知,用作递推的基数*/ else possible_number=2*account(n-1)+(long)pow(2,n-4)-account(n-4); /*坑数为n时会发生爆炸的组合总数=2*坑数为n-1时会发生爆炸的组合总数+坑数为n-4时的组合总数-坑数为n-4时会发生爆炸的组合总数*/ return(possible_number); } main() { int hole_number,n,i;/*hole_number为坑数,n读取howmany.txt中第一个数*/ FILE *fp; printf(″\n″); if ((fp=fopen(″c:\Mywork\howmany.txt″,″r″))==NULL) { printf(″\nCan not open file howmany.txt!″); getch();exit(1); } fscanf(fp,″%d″,&n); for (i=1;i<=n;i++) { fscanf(fp,″%d″,&hole_number); printf(″\n%d %ld″,hole_number,account(hole_number)); } } 9907请你编程题目 1999年4月1日愚人节,天文台收到一组外星人的信息,但无人能理解其含义。于是天文台方面请了一批专家,分析这段信息的意思。经过专家的努力,发现这段信息中的数字部分有如下特点: 1、外星人也采取10进制,他们的数也是由0到9十个数字组成的。 2、对于一位数,外星人的表示方法与我们一致。 3、对于二位以上的数,其特点是:高位的数字总是比低位的数字大,否则为非法。例如:642是合法的,但645和644就是非法的。 4、外星数字排列是连续的,且比较大小的方法和地球人一致。例如:外星数字10代表地球数字10,外星数字20代表地球数字11,外星数字21代表地球数字12。 现在请你编一个程序,负责在地球数字和外星数字之间进行翻译。程序要求如下: 1、输入数据从文本文件UFO.TXT读取。文本格式为:第一行为两个整数M,N。表示有M个地球数字要翻译成外星数字,有N个外星数字要翻译成地球数字。以下M行,每行有一个地球数字;再以下N行,每行有一个合法的外星数字。地球数字翻译后不会大于9876543210,外星数字也不会大于9876543210。 2、输出到屏幕,每个翻译结果占一行,前M行为地球数字翻译的结果,后N行为外星数字翻译的结果。 本次题目由上海的OldBug提供。 输入范例: 1,1 11 21 输出范例: 20 12 来稿请寄磁盘稿或用E-mail投稿,请写明解题思路和源程序(包含详细的注解),将来稿寄到电脑报编辑部的收信地址或E-mail邮箱,同时欢迎提供请你编程的题目。来稿截止日期:1999年7月15日 本期获奖者名单 杨玉琦(天津)陈 鹏(吉林)潘龙刚(江苏) 贺长安(湖南) 刘永锋(河北)游 强(重庆)马拥军(浙江) 陆文杰(广东) 丁晓华(江苏)林 勇(新疆) 每位获奖者将获得苦丁香公司提供的光盘一张。 |
下载本期推荐软件 | 页 首 |
《电脑报》版权所有,电脑报网站编辑部设计制作发布 |