朴秀峰xfpiao@126.com问题求解与程序设计程序举例鸡兔同笼棋盘上的距离校门外的树填词装箱问题贷款利率计算:1-2+3-4+5-6+7+...+n确定进制skew数鸡兔同笼问题描述一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物?输入数据第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(a32768)。输出要求包含n行,每行对应一个输入。输出是两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用空格分开。如果没有满足要求的情况出现,则输出两个0。输入样例输出样例232000510鸡兔同笼#includestdio.h#includestdlib.hintmain(){intnCases,i,nFeet;scanf(%d,&nCases);for(i=0;inCases;i++){scanf(%d,&nFeet);if(nFeet%2!=0)printf(00\n);elseif(nFeet%4!=0)printf(%d%d\n,nFeet/4+1,nFeet/2);elseprintf(%d%d\n,nFeet/4,nFeet/2);}system(pause);return0;}运行环境:DEV-C++4.9.9.2思考趣题:今有鸡、兔若干,它们共有50个头和140只脚,问鸡兔各多少?编程:今有鸡、兔若干,它们共有a个头和b只脚,问鸡兔各多少?棋盘上的距离问题描述国际象棋的棋盘是黑白相间的8*8的方格,棋子放在格子中间。王、后、车、象的走子规则如下:王:横、直、斜都可以走,但每步限走一格。后:横、直、斜都可以走,每步格数不受限制。车:横、竖均可以走,不能斜走,格数不限。象:只能斜走,格数不限。写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。输入样例输出样例2a1c3f5f82121311Infhgfedcba12345678棋盘上的距离intnCases,i;scanf(%d,&nCases);for(i=0;inCases;i++){charbegin[5],end[5];//用begin和end分别存储棋子的起止位置。scanf(%s%s,begin,end);intx,y;//用x和y分别存储起止位置之间x方向和y方向上的距离。x=abs(begin[0]-end[0]);y=abs(begin[1]-end[1]);判定过程,见下页}输入样例输出样例2a1c3f5f82121311Inf棋盘上的距离if(x==0&&y==0)//起止位置相同,所有棋子都走0步。printf(0000\n);else{if(xy)printf(%d,y);//王的步数elseprintf(%d,x);if(x==y||x==0||y==0)printf(1);//后的步数elseprintf(2);if(x==0||y==0)printf(1);//车的步数elseprintf(2);if(abs(x-y)%2!=0)printf(Inf\n);//象的步数elseif(x==y)printf(1\n);elseprintf(2\n);}校门外的树问题描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…,L,都种有一棵树。马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。任务是计算将这些树都移走后,马路上还有多少棵树。输入数据输入的第一行有两个整数L(1≤L≤10000)和M(1≤M≤100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。输出要求输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。校门外的树输入样例输出样例5003150300100200470471298校门外的树intL,i,j,n;//L为区间的长度,n为区间的个数,i和j是循环变量。booltrees[10001];//用一个布尔数组模拟树的存在情况。for(i=0;i10001;i++)trees[i]=true;scanf(%d%d,&L,&n);for(i=0;in;i++){intbegin,end;//用begin,end存储区间的起止位置。scanf(%d%d,&begin,&end);for(j=begin;j=end;j++)//将区间内的树移走,即赋值为false。trees[j]=false;}intcount=0;//用count计数,数数剩余的树的数目。for(i=0;i=L;i++)if(trees[i])count++;printf(%d\n,count);填词问题描述Alex喜欢填词游戏。填词游戏是一个非常简单的游戏。填词游戏包括一个N*M大小的矩形方格盘和P个单词。然后需要把每个方格中填上一个字母使得每个单词都能在方格盘上被找到。每个单词都能被找到要满足下面的条件:每个方格都不能同时属于超过一个的单词。一个长为k的单词一定要占据k个方格。单词在方格盘中出现的方向只能是竖直的或者水平的(可以由竖直转向水平,反之亦然)。你的任务是首先在方格盘上找到所有的单词,当然在棋盘上可能有些方格没有被单词占据。然后把这些没有用的方格找出来,把这些方格上的字母按照字典序组成一个“神秘单词”。如果还不了解规则,可以用一个例子来说明,比如在下图中寻找单词BEG和GEE。填词EBGGEEEGEEBGGEEEGEEBGGEEEGEEBGGEEEGE输入样例输出样例332EBGGEEEGEBEGGEEEEG填词intcharacters[26];intn,m,p;//输入的第一行,输入包括一个n*m的矩阵和p个单词inti,j;//循环变量for(i=0;i26;i++)//赋初值characters[i]=0;scanf(%d%d%d,&n,&m,&p);for(i=0;in;i++){//读入n*m的矩阵,并记录矩阵中每个字母出现的次数charstr[11];scanf(%s,str);for(j=0;str[j]!='\0';j++)characters[str[j]-'A']++;}填词for(i=0;ip;i++){//读入p个单词,并且将单词中出现的字母在//上一段的累计数组中去掉charstr[200];scanf(%s,str);for(j=0;str[j]!='\0';j++)characters[str[j]-'A']--;}for(i=0;i26;i++){//输出所有出现次数大于0的字母。if(characters[i]!=0)for(j=0;jcharacters[i];j++)printf(%c,i+'A');}printf(\n);装箱问题问题描述一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有6个型号,它们的长宽分别为1*1,2*2,3*3,4*4,5*5,6*6。这些产品通常使用一个6*6*h的长方体包裹包装,然后邮寄给客户。因为邮费很贵,所以工厂要想方设法地减少每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题,从而节省费用。现在这个程序由你来设计。输入样例输出样例00400175100000000021装箱问题——解题思路分析六个型号的产品占用箱子的具体情况如下:6*6的产品每个会占用一个完整的箱子,并且没有空余空间;5*5的产品每个占用一个新的箱子,并且留下11个可以盛放1*1的产品的空余空间;4*4的产品每个占用一个新的箱子,并且留下5个可以盛放2*2的产品的空余空间;3*3的产品情况比较复杂:首先3*3的产品不能放在原来盛有5*5或者4*4的箱子中,那么必须为3*3的产品另开新的箱子,新开的箱子数目等于3*3的产品的数目除以4向上取整;同时我们需要讨论为3*3的产品新开箱子时,剩余的空间可以盛放多少2*2和1*1的产品(这里如果有空间可以盛放2*2的产品,我们就将它计入2*2的空余空间,等到2*2的产品全部装完,如果还有2*2的空间剩余,再将它们转换成1*1的剩余空间)。装箱问题——解题思路分情况讨论为3*3的产品打开的新箱子中剩余的空位,共为四种情况:第一种,3*3的产品的数目正好是4的倍数,所以没有空余空间;第二种,3*3的产品数目是4的倍数加1,这时还剩5个2*2的空位和7个1*1的空位;第三种,3*3的产品数目是4的倍数加2,这时还剩3个2*2的空位和6个1*1的空位;第四种,3*3的产品数目是4的倍数加3,这时还剩1个2*2的空位和5个1*1的空位;比较一下剩余的2*2的空位和2*2产品的数目,如果产品数目多,就将2*2的空位全部填满,再为2*2的产品打开新箱子,同时计算新箱子中1*1的空位,如果剩余空位多,就将2*2的产品全部填入2*2的空位,再将剩余的2*2的空位转换成1*1的空位;处理1*1的产品,比较一下1*1的空位与1*1的产品数目,如果空位多,将1*1的产品全部填入空位,否则,先将1*1的空位填满,然后再为1*1的产品打开新的箱子。装箱问题intN,a,b,c,d,e,f,y,x;//N:箱子数目,y:2*2的空位数目,x:1*1的空位数目。intu[4]={0,5,3,1};//数组u表示3*3的产品数目分别是4的倍数,4的倍数+1,4的倍数+2,//4的倍数+3时,为3*3的产品打开的新箱子中剩余的2*2的空位的个数while(1){scanf(%d%d%d%d%d%d,&a,&b,&c,&d,&e,&f);if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)break;N=f+e+d+(c+3)/4;//技巧(c+3)/4正好等于c除以4向上取整的结果y=5*d+u[c%4];if(by)N+=(b-y+8)/9;x=36*N-36*f-25*e-16*d-9*c-4*b;if(ax)N+=(a-x+35)/36;printf(%d\n,N);}贷款利率问题描述一次向银行借a元钱,分b月还清。如果需要每月还c元,月利率是多少(按复利计算)?例如借2000元,分4个月还清,每月还510元,则月利率为0.797%。答案应不超过100%。贷款利率doublea,c,x=0,y=100;inti,b;scanf(%lf%d%lf,&a,&b,&c);while(y-x1e-5){doublem=x+(y-x)/2;doublef=a;for(i=0;ib;i++)f+=f*m/100.0-c;if(f0)x=m;elsey=m;}printf(%.3lf%%\n,x);数制转换问题解决数制转换问题时,如果所给的数值不是用十进制表示的,一般用一个字符型数组来存放。数组的每个元素分别存储它的一位数字。然后按位转换求和,得到十进制表示;再把十进制表示转换成所求的数制表示。转换的结果也用一个字符型数组表示,每个元素表示转换结果的一位数字。根据数制表示中相邻位的基数关系,可以把不同的数制分成两类。相邻位的基数是等比关系,如十进制表示。相邻位的基数是不等比的。例如在时间表示中,从秒到分采用六十进制;从月到年采用十二进制。把一个数值从数制B的表示bmbm-1bm-2...b1转换成十进制表示dndn-1dn-2...d1比较简单。假设数制B中,第i位的基数为basei(1≤i≤m),直接把basei与bi相乘,然后对全部乘积求和