C语言试习题 四_第1页
C语言试习题 四_第2页
C语言试习题 四_第3页
C语言试习题 四_第4页
C语言试习题 四_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言试题 四 6.9 巧分橘子一家农户以果园为生,一天,父亲拿出一堆橘子,共2520个,准备分给他的6个儿子。父亲按事先写在一张纸上的数字把这堆橘子分完,每个人分到的橘子的个数都不相同。然后他说:“老大,把你分到的橘子分1/8给老二,老二拿到后,连同原来的橘子分1/7给老三,老三拿到后,连同原来的橘子分1/6给老四,以此类推,最后老六拿到后,连同原来的橘子分1/3给老大,这样,你们每个人分到的橘子就一样多了。”问兄弟6人原先各分到多少只橘子。 请将兄弟6人的橘子数存储到一维数组中,并按照下列各式输出(下面只提供格式,数据不准确):x1=111x2=222x3=333x4=444x5=555x

2、6=666#include<stdio.h>void main()int a6,b6,i;for(i=0;i<6;i+)ai=2520/6;bi=8-i;a0=a0-(a5/(b5-1);for(i=5;i>=1;i-)ai=ai+(ai/(bi-1)-(ai-1/(bi-1-1);a0=a0*b0/(b0-1);for(i=0;i<6;i+)printf("x%d=%dn",i+1,ai);选做题 6.1 大家一起做游戏幼儿园的小朋友们刚学习了如何数数,阿姨在下课时组织大家一起玩游戏。规则如下:所有的小朋友绕成一圈,顺序排号,从第一个小朋友开

3、始报数,凡是报到固定数字(例如5)的,都退出该游戏,直到只剩下一位小朋友游戏才中止。 每个小朋友都希望自己能有更多的练习数数的机会,所以都希望成为最终被留下的那位。现在,请大家帮小朋友们计算一下,在第一次排号的时候排到第几位才能成为最终被留下的小朋友。输入:小朋友的个数(<=50),要被练习的数字输出:最终被留下的小朋友的序号说明:如“要被练习的数字”是5,则每次数到5的同学要退出该游戏#include<stdio.h>void main()int N,n,i,s=0,a;scanf("%d%d",&N,&n);for(i=2;i<=

4、N;i+)s=(s+n)%i;a=s+1;printf("The left child is NO %d.n",a);选做题6.2 猜数字有如下一组数字,其中每个数字都在 1 63 之间, 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 632 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 34 35 38 39 42 43 46 47 50 51 54 55 58 59 62 634 5 6 7 12 13

5、14 15 20 21 22 23 28 29 30 31 36 37 38 39 44 45 46 47 52 53 54 55 60 61 62 638 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 40 41 42 43 44 45 46 47 56 57 58 59 60 61 62 6316 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 6332 33 34 35 36 37 38 39 40 41 42 43

6、 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 现在需要编写一个程序,当从键盘输入某数字在且仅在哪几行出现了,该程序可以“猜”出这个数字是几。输入:程序的输入是一串以空白 符分开的数字,当输入 0 时表示输入结束。输出:输出猜到的数字。#include<stdio.h>#include<math.h>void main()int i,sum=0;doscanf("%d",&i);sum=sum+pow(2,i-1);while(i!=0);printf("%d

7、n",sum);选做题 6.3 小蜜蜂一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。 输入:分别是起始点 a 和终止点 b 的编号。( a 和 b 在 1100 之间,且 a<b 。) 输出:可行的路线数目#include<stdio.h>void main()int a,b,x,i;int f100;f1=1;f2=2;scanf("%d%d",&am

8、p;a,&b);x=b-a;if(x=1)printf("%dn",f1);if(x=2)printf("%dn",f2);if(x>=3)for(i=3;i<=x;i+)fi=fi-1+fi-2;printf("%dn",fx);选做题 6.4 数制转换我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。 这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进

9、制或十进制时,它们的值就是相等的。因此只要选择合适的进制, 12 和 5 就可以是相等的。 程序的输入是两个数字 M 和 N( 其十进制的值不超过 00) ,它们的进制在 236 之间。对于十以下的数字,用 09 表示,而十以上的数字,则使用大写的 AZ 表示。 求出分别在 236 哪种进制下 M 和 N 相等。若相等则输出相应的进制,若不等则输出错误信息。信息的格式见测试用例。#define N 50 #include"string.h" #include"stdio.h" int main()char aN,bN,dN,eN,d0N; int i,j

10、,o,r,g,h,w,t,l,k,max1,max2; double pN,qN=0,uN,vN=0,cN,fN,m,n;for(i=0;i<N;i+)scanf("%c",&ai); if(ai='x20') l=i; break; gets(d); if(d0!='x20')k=strlen(d);goto C;if(d0='x20')strcpy(d0,d);g=strlen(d0);for(i=0;d0i='x20'i+);j=i;for(i=0;i<g-j;i+)di=d0i+j;

11、k=g-j; C:for(i=0;i<l;i+) bi=al-i-1; if(bi<='x39'&&bi>='x30') ci=bi-'0' if(bi<='x5A'&&bi>='x41') ci=bi-'7' for(i=0;i<k;i+) ei=dk-i-1; if(ei<='x39'&&ei>='x30') fi=ei-'0' if(ei<=&#

12、39;x5A'&&ei>='x41') fi=ei-'7' max1=c0; for(i=1;i<l;i+) if(max1<ci) max1=ci; if(max1=0) max1=1;max2=f0; for(i=1;i<k;i+) if(max2<fi) max2=fi; if(max2=0) max2=1; for(i=max1+1;i<=36;i+)for(j=0;j<l;j+)m=cj;for(g=0;g<j;g+)m=m*i;qi=qi+m;for(i=max2+1;i<

13、=36;i+)for(j=0;j<k;j+)n=fj;for(g=0;g<j;g+)n=n*i;vi=vi+n; for(g=max1+1;g<=36;g+) for(h=max2+1;h<=36;h+) if(qg=vh)w=g,t=h;goto out;for(i=0;i<l;i+)printf("%c",ai);printf(" is not equal to ");for(i=0;i<k;i+)printf("%c",di);printf(" in any base 2.36n&q

14、uot;);goto outs;out:for(i=0;i<l;i+)printf("%c",ai);printf(" (base %d) = ",w);for(i=0;i<k;i+)printf("%c",di);printf(" (base %d)n",t);outs:;选做题 6.5 等值数列段如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。 输入:由N个元素组成的整数数列A(其中N<=50)输出:A中长度最大的等值数

15、列段的始末位置,如果没有等值数列段,则输出No equal number list.说明:始末位置是指数组下标,即0表示第一个元素。如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。当在一个LIST中出现两个等长的连续串的时候,我们的答案应该是第一个等长串。#include<stdio.h>void main()int a50;int f10=0;int n,i,j,k=-1,t,q,s,o,o1,count=1,max=-1;scanf("%d",&n);for(i=0;i<=n-1;i+)scanf("%d",&

16、amp;ai);dofor(j=0;j<=n-1;j+)if(aj=aj+1)count=count+1;k=count;fj+1=fj+1+k;if(aj!=aj+1)count=1;continue;max=k;while(max<k);if(max=-1)printf("No equal number list.n");/for(q=0;q<=n-1;q+)/printf("%d ",fq);/printf("n");elseo=f0;for(s=1;s<=n-1;s+)if(fs>o)o=fs;o

17、1=s;/printf("%d %d",o1,o);/printf("n");printf("The longest equal number list is from %d to %d.n",o1-o+1,o1);选做6.6 邮票组合背景:我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。现在,邮局有4种不同面值的邮票。在每个信封上最多能贴5张邮票,面值可相同,可不同。输入:四种邮票的面值。输出:用这四种面值组成的邮资最大的从1开始的一个连续的区间。说明:如结果为10

18、,则表明使用4张邮票可组合出1、2、3、4、5、6、7、8、9、10这些邮资。名词解释:邮 资:就是你寄东西需要花多少钱。邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。如果你寄东西,邮局称了重量,告诉你要240分。这样你就要贴邮票了。如果现在邮局的邮票有面值为80分、50分、20分和10分的四种,你就可以采用不同的组合得到240的邮资,例如:采用3张80分的可以凑出240分;或者24张10分的凑起来240分也可以。显然不同邮票的组合都可以得到同样一种邮资。#include<stdio.h> int neng(int a,int max) int i,j,k,m,n;in

19、t sum;for(i=0;i<5;i+)for(j=0;j<5;j+)for(k=0;k<5;k+)for(m=0;m<5;m+)for(n=0;n<5;n+)sum=ai+aj+ak+am+an;if (sum=max)return 1;return 0;void main()int a5,i;int max=0;a4=0;scanf("%d%d%d%d",&a0,&a1,&a2,&a3);while(1)if(neng(a,max)max+;else break;printf("The max i

20、s %d.n",max-1);选做6.7 十进制数转换为16位二进制数将任一正整数(<65536)转换为 16 位二进制形式。输入: 正整数 输出: 正整数的 16 位二进制数 友情提示:定义一个整型数组,数组有16个元素,保存变换后的二进制数。#include<stdio.h>void main()int n,i;int a16;scanf("%d",&n);if(n>0&&n<65536)for(i=0;i<=15;i+)ai=n%2;n=n/2;for(i=15;i>=0;i-)printf(

21、"%d",ai);printf("n");elseprintf("Invalid input!n");选做题6.9 折半插入排序排序是程序设计中的重要内容之一,据不完全统计,在一般的数据处理程序中,排序占去了处理机时间的四分之一,而在典型的安装程序中,一半以上的时间用在对表的排序上。常用的排序算法有:直接插入排序,折半插入排序,希尔排序,起泡排序,快速排序,选择排序,堆排序等。其中直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。在直接插入排序中,为了找到插入位置,采用了顺序查找的方法。

22、为了提高查找速度,可以采用折半查找,这种排序称折半插入排序。折半查找法先取有序数组的中间元素与查找值相比较。如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较。如查找值小于中间元素,则再取低半部的中间元素与查找值相比较。如此重复直到查找成功或最终未找到该数为止。在折半插入排序算法中,由于进行关键字比较的次数比较少,所以算法的效率就比较高。例如:有序列10,90,80,30,20,15。我们进行折半插入排序的过程如下:初始(第1趟):有序子序列为空。待排序数 据为10,则不需要进行关键字比较,直接插入。第2趟:有序子序列为“10”,待排序数据为90,进行1次比较就可以确

23、定插入位置,得到长度+1的有序子序列“10,90”。此时比较次数为 1 。第2趟:有序子序列为“10,90”。待排序数据为80,取有序序列中间(取整)的元素10进行第 1 次比较,80大;则应该从“90”这个子序列中进行折半插入80,进行第 2 次比较,定位应该的插入位置,得到有序序列“10,80,90”。此趟比较次数为 2。第3趟:有序子序列为“10,80,90”。待排序数据为30,取有序序列中间的元素80进行第 1 次比较,30小;则应该从“10”这个子序列中进行折半插入30,进行第 2 次比较,可以定位应该插入的位置,得到新的长度+1的有序子序列。此趟比较次数为 2。第4趟:有序子序列为

24、“10,30,80,90”。待排序数据为20,取有序序列中间的元素30进行第 1 次比较,20小;则应该从“10”这个子序列中进行折半插入20,进行第 2 次比较,可以确定应该插入的位置。此趟比较次数为 2。第5趟:有序子序列为“10,20,30,80,90”。待排序数据为15,取有序序列中间的元素30进行第 1 次比较,15小;则应该从“10,20”这个子序列中进行折半插入15,取子序列中间的元素10,进行第 2 次比较,15大,则应该从“20”这个子序列中进行折半插入排序,再进行 1 次比较就可以确定应该插入的位置。此趟比较次数为 3。此时,完成排序,得到升序序列“10,15,20,30,

25、80,90”。在整个排序过程中进行关键字比较的总次数 = 0+1+2+2+2+3 = 10。输入:数列中元素个数(元素数量<=100)数列输出:使用折半插入排序后的有序升序数列在折半插入排序过程中进行关键字比较的次数说明:输出个数列之间用空格分隔#include <stdio.h> int main() int n,a100,b100,i,j,count=0,lengthb=1; scanf("%dn",&n); for(i=0;i<n;i+) scanf("%d",&ai); b0=a0; for(i=1;i&l

26、t;n;i+) int c=0,d=lengthb-1,flag=0; do if(ai>b(c+d)/2) /待插入数字大于中间值 c=(c+d)/2+1; count+; else if(ai<b(c+d)/2) /待插入数字小于中间值d=(c+d)/2-1; count+; else count+; flag=1; break; while(c<=d); /处理最后一个数字 if(flag=0) for(j=i-1;j>=c;j-) bj+1=bj; bc=ai; lengthb+; for(i=0;i<lengthb;i+) printf("%d

27、",bi); if(i!=lengthb-1)printf(" "); printf("n%dn",count); return 0; 8.1 合并字符串输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到 大排列。输入:两个已经排好顺序(升序)的两个字符串输出:一个合并在一起的有序(升序)的字符串要求:设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。如果采用先进行串连接,然后再进行排序的算法,则效率太低了。#include <stdio.h>#include <st

28、dlib.h>#include <string.h>int main()char a100,b100,t;int k,i,j;gets(a);gets(b);strcat(a,b);k=strlen(a);for(j=1;j<=k;j+)for(i=0;i<k-j;i+)if(ai>=ai+1)t=ai;ai=ai+1;ai+1=t;puts(a);return 0;8.3 删除重复字符背景: 输入一个长度不超过 100 的字符串,删除串中的重复字符。输入:输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。输出:删除重复字符后的

29、字符串。例如:abced。#include <stdio.h>#include <stdlib.h>#include <string.h>int main()char a100,b100;int n,i,j,cnt=1;gets(a);n=strlen(a);b0=a0;for(i=1;i<n;i+)for(j=0;j<i;j+)if(ai=aj)break;if(ai=aj&&i=j)bcnt=ai;cnt+;for(i=0;i<cnt;i+)printf("%c",bi);printf("n

30、");return 0;8.4 删除字符串中指定字符输入两个字符串 s1 和 s2 ,在 s1 中删除任何 s2 中有的字符。例如, s1 :“ abc123ad ”, s2 :“ a1 ” ,则输出“bc23d ”。输入: 两个字符串 s1 和 s2 输出: 删除后的字符串 s1 #include <stdio.h>#include <stdlib.h>#include <string.h>int main()char a100,b100,c100;int x,y,i,j,cnt;scanf("%s",a);scanf(&qu

31、ot;%s",b);x=strlen(b);y=strlen(a);for(j=0;j<x;j+)cnt=0;for(i=0;i<y;i+)if(ai!=bj)ccnt=ai;cnt+;strcpy(a,c);y=cnt;for(i=0;i<cnt;i+)printf("%c",ci);printf("n");return 0;8.5 单词有多少用空格或换行分开的字符串称为单词。输入多行字符串,直到遇到了单词 "stop" 时才停止。最后输出单词的数量。用于分割单词的空格或换行可能多于1个。输入: 多个字符

32、串 输出: 单 词的数量#include <stdio.h> #include <malloc.h> #include <string.h> void main() int count=0; char *word ; while(1) word=(char *) malloc (sizeof(char)*20); scanf("%s",word); +count; if(0=strcmp(word,"stop") break; free(word); printf("%dn",count-1); 8

33、.6 在指定位置插入字符串输入两个字符串 s1 、 s2 和 s1 中任意字符 k ,在 s1 中的指定字符 k 第一次出现的位置处插入字符串 s2 并输出。输入: 两个字符串 s1 、 s2 和 s1 中任意字符 k 输出: 插入后的字符串 s1 #include<stdio.h>#include<string.h>void main()char s1100,s2100,s3100;char c;int i,j,n,t,count=-1;gets(s1);gets(s2);n=strlen(s1);t=strlen(s2);scanf("%c",&

34、amp;c);for(i=0;i<=n-1;i+)count=count+1;if(c=s1i)break;for(i=0;i<count;i+)s3i=s1i;for(i=count;i<count+t;i+)s3i=s2i-count;for(i=count+t;i<=n+t;i+)s3i=s1i-t;puts(s3);/*for(i=0;i<q;i+)printf("%c",s3i);printf("n");*/选做T 8.1 拱猪计分背景:拱猪是一种很有趣的扑克牌游戏。即使你不知道它的玩法,你也可以由它的计分方式来了

35、解它的趣味性。 假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。 我们分别以S、H、D及C来代表黑桃,红心,方块及梅花,并以数字1至 13来代表A、2、Q、K等牌点,例如:H1为红心A,S13为黑桃K。 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有S12(猪),所有红心牌,D11(羊)及C10(加倍)等16张牌。其它牌均弃置不计。若未持有这16张牌之任一张则以得零分计算。 若持有C10的玩家只有该张牌而没有任何其它牌则得+50分,若除了C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。 若红心牌不在同一家,则H1至H13等13张

36、牌均以负分计,其数值为-50, -2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且S12与D11分别以-100及+100分计算。 若红心牌H1至H13均在同一家,有下列情形: 所有红心牌以+200分计算。 若S12、D11皆在吃下所有红心牌之一家,则此玩家得+500分。 而C10还是以前面所述原则计算之。 例一:若各玩家持有计分牌如下: ( 每行代表一玩家所持有之牌 ) S12 H3 H5 H13D11 H8 H9C10 H1 H2 H4 H6 H7H10 H11 H12 则各家之得分依序为: -148 、 +83 、 -138 及 -60 。 例二:若各玩家

37、持有计分牌如下:(第四家未持有任何计分牌)H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13S12 C10D11 则各家之得分依序为: +200 、 -200 、 +100 及 0 。 例三:若有一玩家持有所有 16 张计分牌,则得 +1000 分。其余三家均得零分。 输入:每个输入文件由多组测试数据构成,每组测试数据有四行,每一行第一个数为该玩家所持有计分牌总数,而后列出其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。相邻两组测试数据之间不会有空白行,读到四家持牌数都为 0 表示文件结束。 输出:每一行输出一组测试数据对应的结果,依次输出各家所得

38、分数,共四个整数 ( 含正负号,0 除外),相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。每组输出间不需要有空白行。 #include "stdio.h" int myinput(int card,int number) int i,n; char s5; for(i=0;i<4;i+) scanf("%d",&n); numberi=n; while(n-) scanf("%s",s); switch(s0) case 'S':card13=i;break; case 'D'

39、:card14=i;break; case 'C':card15=i;break; case 'H':s2='0'(cards1-'1'=i):(cards2-'1'+10=i); return number0+number1+number2+number3; int main() int value15=-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40,-100,100, card16, score4=0,0,0,0, number4, i,s, input(); while

40、(myinput(card,number) for(i=0,s=0;i<13;i+) s+=cardi; if(s%13) for(i=0;i<15;i+) scorecardi+=valuei; else if(card0=card13&&card13=card14) scorecard0+=500; else scorecard0+=200; scorecard14+=value14; scorecard13+=value13; scorecard15+=numbercard15=1?50:scorecard15; for(i=0;i<4;i+) prin

41、tf("%s%d%s",scorei>0"+":"",scorei,i=3"n":" "); for(i=0;i<4;i+) scorei=0; return 0; 选作T 8.2 合并果子在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和

42、。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。输入:输入包括两行,第一行是一个整数n(1<n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<ai<=10000)是第i种果子的数目。输出: 输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。#include<stdio.h>#incl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论