版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-24-8.1合并字符串输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。输入:两个已经排好顺序(升序)的两个字符串输出:一个合并在一起的有序(升序)的字符串要求:设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。如果采用先进行串连接,然后再进行排序的算法,则效率太低了。#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){chara[100],b[100],t;intk,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(a[i]>=a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}puts(a);return0;}8.3删除重复字符背景:输入一个长度不超过100的字符串,删除串中的重复字符。输入:输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。输出:删除重复字符后的字符串。例如:abced。#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){chara[100],b[100];intn,i,j,cnt=1;gets(a);n=strlen(a);b[0]=a[0];for(i=1;i<n;i++){for(j=0;j<i;j++){if(a[i]==a[j])break;}if(a[i]==a[j]&&i==j){b[cnt]=a[i];cnt++;}}for(i=0;i<cnt;i++)printf("%c",b[i]);printf("\n");return0;}8.4删除字符串中指定字符输入两个字符串s1和s2,在s1中删除任何s2中有的字符。例如,s1:“abc123ad”,s2:“a1”,则输出“bc23d”。输入:两个字符串s1和s2输出:删除后的字符串s1#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){chara[100],b[100],c[100];intx,y,i,j,cnt;scanf("%s",a);scanf("%s",b);x=strlen(b);y=strlen(a);for(j=0;j<x;j++){cnt=0;for(i=0;i<y;i++)if(a[i]!=b[j]){c[cnt]=a[i];cnt++;}strcpy(a,c);y=cnt;}for(i=0;i<cnt;i++)printf("%c",c[i]);printf("\n");return0;}8.5单词有多少用空格或换行分开的字符串称为单词。输入多行字符串,直到遇到了单词"stop"时才停止。最后输出单词的数量。用于分割单词的空格或换行可能多于1个。输入:多个字符串输出:单词的数量#include<stdio.h>#include<malloc.h>#include<string.h>voidmain(){intcount=0;char*word;while(1){word=(char*)malloc(sizeof(char)*20);scanf("%s",word);++count;if(0==strcmp(word,"stop"))break;free(word);}printf("%d\n",count-1);}8.6在指定位置插入字符串输入两个字符串s1、s2和s1中任意字符k,在s1中的指定字符k第一次出现的位置处插入字符串s2并输出。输入:两个字符串s1、s2和s1中任意字符k输出:插入后的字符串s1#include<stdio.h>#include<string.h>voidmain(){chars1[100],s2[100],s3[100];charc;inti,j,n,t,count=-1;gets(s1);gets(s2);n=strlen(s1);t=strlen(s2);scanf("%c",&c);for(i=0;i<=n-1;i++){count=count+1;if(c==s1[i])break;}for(i=0;i<count;i++)s3[i]=s1[i];for(i=count;i<count+t;i++)s3[i]=s2[i-count];for(i=count+t;i<=n+t;i++)s3[i]=s1[i-t];puts(s3);/*for(i=0;i<q;i++){printf("%c",s3[i]);}printf("\n");*/}选做T8.1拱猪计分背景:拱猪是一种很有趣的扑克牌游戏。即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。我们分别以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张牌均以负分计,其数值为-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且S12与D11分别以-100及+100分计算。若红心牌H1至H13均在同一家,有下列情形:所有红心牌以+200分计算。若S12、D11皆在吃下所有红心牌之一家,则此玩家得+500分。而C10还是以前面所述原则计算之。例一:若各玩家持有计分牌如下:(每行代表一玩家所持有之牌)S12H3H5H13D11H8H9C10H1H2H4H6H7H10H11H12则各家之得分依序为:-148、+83、-138及-60。例二:若各玩家持有计分牌如下:(第四家未持有任何计分牌)H1H2H3H4H5H6H7H8H9H10H11H12H13S12C10D11则各家之得分依序为:+200、-200、+100及0。例三:若有一玩家持有所有16张计分牌,则得+1000分。其余三家均得零分。输入:每个输入文件由多组测试数据构成,每组测试数据有四行,每一行第一个数为该玩家所持有计分牌总数,而后列出其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。相邻两组测试数据之间不会有空白行,读到四家持牌数都为0表示文件结束。输出:每一行输出一组测试数据对应的结果,依次输出各家所得分数,共四个整数(含正负号,0除外),相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。每组输出间不需要有空白行。#include"stdio.h"intmyinput(intcard[],intnumber[]){inti,n;chars[5];for(i=0;i<4;i++){scanf("%d",&n);number[i]=n;while(n--){scanf("%s",s);switch(s[0]){case'S':card[13]=i;break;case'D':card[14]=i;break;case'C':card[15]=i;break;case'H':s[2]=='\0'?(card[s[1]-'1']=i):(card[s[2]-'1'+10]=i);}}}returnnumber[0]+number[1]+number[2]+number[3];}intmain(){intvalue[15]={-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40,-100,100},card[16],score[4]={0,0,0,0},number[4],i,s,input();while(myinput(card,number)){for(i=0,s=0;i<13;i++)s+=card[i];if(s%13){for(i=0;i<15;i++)score[card[i]]+=value[i];}else{if(card[0]==card[13]&&card[13]==card[14])score[card[0]]+=500;else{score[card[0]]+=200;score[card[14]]+=value[14];score[card[13]]+=value[13];}}score[card[15]]+=number[card[15]]==1?50:score[card[15]];for(i=0;i<4;i++)printf("%s%d%s",score[i]>0?"+":"",score[i],i==3?"\n":"");for(i=0;i<4;i++)score[i]=0;}return0;}选作T8.2合并果子在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为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>#include<string.h>#include<math.h>voidmain(){inti,j,k,t,n,sum=0;inta[10]={0};intb[10]={0};chars[10][100];scanf("%d",&n);for(i=1;i<=n;i++)scanf("%s",s[i]);for(t=1;t<=n;t++)a[t]=strlen(s[t]);for(i=1;i<=n;i++)for(j=0;j<a[i];j++)s[i][j]=s[i][j]-48;for(j=1;j<=n;j++){for(i=0;i<=a[j]/2-1;i++){t=s[j][i];s[j][i]=s[j][a[j]-1-i];s[j][a[j]-1-i]=t;}}for(j=1;j<=n;j++){for(i=0;i<=a[j];i++){b[j]=b[j]+s[j][i]*pow(10,i);}}for(j=1;j<=n-1;j++)for(i=1;i<=n-j;i++){if(b[i]>b[i+1]){t=b[i];b[i]=b[i+1];b[i+1]=t;}}sum=(n-1)*(b[1]+b[2]);for(i=2;i<=n-1;i++)sum=sum+(n-i)*b[i+1];printf("%d\n",sum);}选作T8.3安全的密码随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。任务小林正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。应当按照以下的规则来判断密码是否安全:如果密码长度小于6位,则不安全如果组成密码的字符只有一类,则不安全如果组成密码的字符有两类,则为中度安全如果组成密码的字符有三类或以上,则为安全通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。输入:输入的第一行是一个整数N,表明后面有多少组密码。随后的N行输入包括N个密码,每个密码的长度均小于20个字符。输出:针对每一个密码判断并输出它是否安全。对于不安全的密码输出"NotSafe",对于中度安全的密码输出"MediumSafe",对于安全的密码输出"Safe"输入样例41234abcdefABC1231#c3Gh输出样例NotSafeNotSafeMediumSafeSafe#include<stdio.h>#include<string.h>voidmain(){intn,i,j,k,t,flag1=0,flag2=0,flag3=0,flag4=0;chars[20][50];scanf("%d",&n);for(i=0;i<=n;i++)gets(s[i]);for(i=1;i<=n;i++){t=strlen(s[i]);if(t<6)printf("NotSafe\n");if(t>=6){for(flag1=0,flag2=0,flag3=0,flag4=0,j=0;s[i][j]!='\0';j++){if(s[i][j]>=48&&s[i][j]<=57)flag1++;if(s[i][j]>=65&&s[i][j]<=90)flag2++;if(s[i][j]>=97&&s[i][j]<=122)flag3++;if((s[i][j]>=33&&s[i][j]<=47&&s[i][j]>=58&&s[i][j]<=64&&s[i][j]>=91&&s[i][j]<=96&&s[i][j]>=123&&s[i][j]<=126)||(s[i][j]==''))flag4++;}if(flag1==t||flag2==t||flag3==t||flag4==t)printf("NotSafe\n");if((flag1*flag2>0&&flag3==0&&flag4==0)||(flag1*flag3>0&&flag2==0&&flag4==0)||(flag1*flag4>0&&flag2==0&&flag3==0)||(flag2*flag3>0&&flag1==0&&flag4==0)||(flag2*flag4>0&&flag3==0&&flag1==0)||(flag3*flag4>0&&flag1==0&&flag2==0))printf("MediumSafe\n");if((flag1*flag2*flag3>0&&flag4==0)||(flag1*flag2*flag4>0&&flag3==0)||(flag1*flag4*flag3>0&&flag2==0)||(flag4*flag2*flag3>0&&flag1==0)||(flag1*flag2*flag3*flag4>0))printf("Safe\n");}}}选作T8.4扫雷背景:你玩儿过扫雷游戏吧?有个操作系统中带了这个小游戏,那个系统叫什么来着?在游戏中要想过关,就必须要在一个NxM的区域上找出所有的地雷。游戏过程中,计算机会在地图上显示一些数字从而帮助你确定哪里有地雷。例如,在下面这个有两颗地雷的4x4的地图(*表示地雷):**根据上面的地图,可以计算出应该提供给游戏者的数字如下所示:*10022101*101110每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有八个。输入:输入中将包括一系列的地图,每个地图的第一行有两个整数n和m(0<n,m<=100),它们表示了地图的行数和列数。下面的n行每行都有m个字符,其中"."表示安全而"*"表示地雷。如果地图的n和m都为0,则表示输入结束。输出:针对每一个地图,首先输出一行:Field#x:其中x是当前地图的编号(从1开始)。下面的n行则将地图中的"."以数字表示,该数字表示该方格周围有多少颗地雷。#include<stdio.h>#include<string.h>#include<stdlib.h>#defineN9voidmain(){inti,j,k,t=1,x1,x2;intn[100],m[100];charc[100][100][100];chars[100][100][100];for(k=1;k<=N;k++){scanf("%d%d",&n[k],&m[k]);if(n[k]==0&&m[k]==0)break;t++;for(j=0;j<n[k];j++){scanf("%s",&c[k][j]);}for(j=0;j<n[k];j++)for(i=0;i<m[k];i++)s[k][j][i]='0';for(j=0;j<n[k];j++){for(i=0;i<m[k];i++){if(c[k][j][i]=='*'){s[k][j][i]=c[k][j][i];}}}for(j=0;j<n[k];j++){for(i=0;i<m[k];i++){if(c[k][j][i]=='*'){s[k][j][i]=c[k][j][i];if(j==0&&i==0){for(x1=0;x1<=1;x1++)for(x2=0;x2<=1;x2++)if(s[k][j+x1][i+x2]!='*'){s[k][j+x1][i+x2]++;}}if(j==0&&i>0){for(x1=0;x1<=1;x1++)for(x2=-1;x2<=1;x2++)if(s[k][j+x1][i+x2]!='*'){s[k][j+x1][i+x2]++;}}if(i==0&&j>0){for(x1=-1;x1<=1;x1++)for(x2=0;x2<=1;x2++)if(s[k][j+x1][i+x2]!='*'){s[k][j+x1][i+x2]++;}}if(i>0&&j>0){for(x1=-1;x1<=1;x1++)for(x2=-1;x2<=1;x2++)if(s[k][j+x1][i+x2]!='*'){s[k][j+x1][i+x2]++;}}}}}}for(k=1;k<=t-1;k++){printf("Field#%d:\n",k);for(j=0;j<n[k];j++){for(i=0;i<m[k];i++)printf("%c",s[k][j][i]);printf("\n");}if(k!=t-1)printf("\n");}}选作T8.5身份证的奥秘背景18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:一、范围该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。二、编码对象公民身份号码的编码对象是具有中华人民共和国国籍的公民。三、号码的结构和表示形式1、号码的结构公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。2、地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。3、出生日期码表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。4、顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。5、校验码(1)十七位数字本体码加权求和公式S=Sum(Ai*Wi),i=0,...,16,先对前17位数字的权求和Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子Wi:7910584216379105842(2)计算模Y=mod(S,11)(3)通过模得到对应的校验码Y:012345678910校验码:10X98765432四、举例如下:北京市朝阳区东省汕头市:44052418800101001415位的身份证号升级办法:15位的身份证号:ddddddyymmddxxp18位的身份证号:ddddddyyyymmddxxpy其中dddddd为地址码(省地县三级)yyyymmddyymmdd为出生年月日xx顺号类编码p性别15位的yy年升为18位后,变成19yy年,但对于百岁以上老人,则为18yy年,此时,他们的最后三位顺序码为996,997,998或999来标记。输入输入n组身份证号码,第一行为个数,以后每行为身份证号码。输出如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出#include<stdio.h>#include<string.h>voidmain(){intWi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};charyan[11]={'1','0','X','9','8','7','6','5','4','3','2'};inti,j,k,n,sum=0,Y=0,q,sum1=0,Y1=0;intt[20];chars[10][19];charb[10][19];scanf("%d",&n);for(i=1;i<=n;i++)scanf("%s",s[i]);for(i=1;i<=n;i++)t[i]=strlen(s[i]);for(k=1;k<=n;k++){if(t[k]==18){Y=0;sum=0;for(i=0;i<=17;i++)s[k][i]=s[k][i]-48;//for(Y=0,sum=0,i=1;i<=n;i++)//{for(j=0;j<=16;j++)sum=sum+s[k][j]*Wi[j];Y=sum%11;//}for(j=0;j<=17;j++)s[k][j]=s[k][j]+48;if(s[k][17]==yan[Y])printf("Valid\n");if(s[k][17]!=yan[Y])printf("Invalid\n");}if(t[k]==15){Y1=0;sum1=0;for(q=0;q<=5;q++)b[k][q]=s[k][q];if(s[k][12]=='9'&&s[k][13]=='9'){b[k][6]='1';b[k][7]='8';}if(s[k][12]!='9'||s[k][13]!='9'){b[k][6]='1';b[k][7]='9';}for(q=6;q<=14;q++){b[k][q+2]=s[k][q];}for(j=0;j<=16;j++)b[k][j]=b[k][j]-48;//for(i=1;i<=n;i++)//{for(j=0;j<=16;j++)sum1=sum1+b[k][j]*Wi[j];Y1=sum1%11;//}for(j=0;j<=16;j++)b[k][j]=b[k][j]+48;b[k][17]=yan[Y1];for(j=0;j<=17;j++)printf("%c",b[k][j]);printf("\n");}}}9.1数的合并请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a的十位和个位依次存放在c数的十位和千位上,b的十位和个位依次存放在c数的个位和百位上。例如:当a=45,b=12,调用该函数后,c=5241。部分源程序如下,只需要完成fun函数的编写即可。#include<stdio.h>intfun(inta,intb){//只需要完成此函数的功能即可}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=fun(a,b);printf("c=%d\n",c);}#include<stdio.h>intfun(inta,intb){intc,d;d=a%10;a=a/10;c=d*1000+a*10;d=b%10;b=b/10;c=c+b+d*100;returnc;}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=fun(a,b);printf("c=%d\n",c);}9.2素数的判断请编写函数fun,其功能是判断一个整数n是否为素数,如果是素数,则返回1,否则返回0。部分源程序给出如下,请勿改动主函数main和其他函数,仅在函数fun的花括号中填入所编写的代码即可。#include<stdio.h>intfun(intn){//仅需要在此完成函数的功能即可}intmain(){inta;scanf("%d",&a);if(fun(a))printf("Prime\n");elseprintf("NonPrime\n");}#include<stdio.h>intfun(intn){inti,flag=0;for(i=2;i<n;i++){if(n%i==0)flag++;}if(flag==0)return1;if(flag>0)return0;}intmain(){inta;scanf("%d",&a);if(fun(a))printf("Prime\n");elseprintf("NonPrime\n");}9.3求级数请编写函数fun,它的功能是计算下列级数和,值由函数值返回。例如,当n=10,x=0.3时,函数值为1.349859。请勿改动主函数main,仅在函数fun的花括号中填入所编写的若干语句。#include<stdio.h>doublefun(doublex,intn){}intmain(){doublex;intn;scanf("%lf%d",&x,&n);printf("%lf\n",fun(x,n));}#include<stdio.h>#include<math.h>doublen1(intn){doublesum1=1;intj;for(j=1;j<=n;j++)sum1=sum1*j;return(sum1);}doublefun(doublex,intn){doublesum=1;inti;for(i=1;i<=n;i++)sum=sum+pow(x,i)/n1(i);returnsum;}intmain(){doublex;intn;scanf("%lf%d",&x,&n);printf("%lf\n",fun(x,n));}9.4求大于m且紧靠m的k个素数请编写一个函数,其功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中。例如,若输入175,则应输出1923293137请勿改动主函数main,仅在函数fun的花括号中填入所编写的若干语句。#include<stdio.h>voidfun(intm,intk,intxx[]){}intmain(){intm,n,zz[1000];scanf("%d%d",&m,&n);fun(m,n,zz);for(m=0;m<n;m++)printf("%6d",zz[m]);printf("\n");return0;}#include<stdio.h>#include<math.h>voidfun(intm,intk,intxx[]){inti,j,t=0,n;for(i=m+1;;i++){n=sqrt(i);for(j=2;j<=n;j++)if(i%j==0)break;if(j>=n+1){xx[t]=i;t++;}if(t==k)break;}}intmain(){intm,n,zz[1000];scanf("%d%d",&m,&n);fun(m,n,zz);for(m=0;m<n;m++)printf("%6d",zz[m]);printf("\n");return0;}9.5删除指定字符请编写函数fun,其功能是:从字符串中删除指定的字符。同一字母的大、小写按照不同的字符处理。部分源程序给出如下:#include<stdio.h>voidfun(chars[],charc){}intmain(){charstr[80];charch;gets(str);scanf("%c",&ch);fun(str,ch);printf("%s\n",str);return0;}#include<stdio.h>#include<string.h>voidfun(chars[],charc){inti,t,j;t=strlen(s);for(i=0;i<t;i++)if(s[i]==c)for(j=i;j<t;j++)s[j]=s[j+1];}intmain(){charstr[80];charch;gets(str);scanf("%c",&ch);fun(str,ch);printf("%s\n",str);return0;}9.6杀鸡用牛刀——学习递归喽背景:哈哈!我们终于学了递归了,现在大家一定感到非常有意思吧,那个典型的“汉诺塔”问题,一个非常短的程序居然可以完成如此复杂的工作,真是神奇啊!来吧,让我们也动手编写一个递归程序,当然,我们要编写的不可能太复杂。功能:求整数n到m区间的累加和,其中n<=m。输入:区间的起始点n区间的终止点m输出:累加和要求:使用递归算法完成。#include<stdio.h>#include<string.h>intfun(inti,intj){intsum=0,t;for(t=i;t<=j;t++)sum=sum+t;return(sum);}intmain(){inti,j;scanf("%d%d",&i,&j);printf("%d\n",fun(i,j));return0;}9.7求最大公约数——递归请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。输入:n和m输出:n和m的最大公约数#include<stdio.h>intf(intn,intm){inti;if(m<=n&&n%m==0)i=m;if(n<m)i=f(m,n);if(m<=n&&n%m!=0)i=f(m,n%m);returni;}voidmain(){intn,m;scanf("%d%d",&n,&m);printf("%d\n",f(n,m));}9.8求数列的第N项已知整数数列第一项和第二项是1,该数列从第三项开始,如果该项是奇数项,则它是前两项之和,如果该项是偶数项,则它是前两项之差,即:f(n)=1当n=1或2时,f(n)=f(n-1)-f(n-2)当n是偶数时,f(n)=f(n-1)+f(n-2)当n是奇数时,编写一个递归函数,求数列的第N项。#include<stdio.h>intf(intn){intsum;inti;if(n==1||n==2)i=1;if(n>2&&n%2==0){i=f(n-1)-f(n-2);}if(n>2&&n%2!=0){i=f(n-1)+f(n-2);}return(i);}voidmain(){intn,i;scanf("%d",&n);printf("%d\n",f(n));}9.9偶数分解编写程序,输入若干个大于2的正整数,如果是偶数,则将其分解为两个素数并输出;如果输入的奇数,则输出“×××isoddnumber!”;输入为0时程序结束。只有1和它本身这两个因数的自然数叫做素数,0和1既不是素数也不是和数。实现分解的过程用函数实现。输入:整数序列,0输出:偶数1=素数A+素数B(当输入是偶数时)奇数1isoddnumber!(当输入是奇数时)#include<stdio.h>#include<stdlib.h>intss(intn){inti,t;for(i=2;i<n;i++)if(n%i==0){t=0;break;}if(i>=n)t=1;return(t);}voidfun(intq){intk;if(q%2!=0)printf("%disoddnumber!\n",q);if(q%2==0){for(k=2;k<q;k++){if(ss(k)==1&&ss(q-k)==1){printf("%d=%d+%d\n",q,k,q-k);break;}}}}intmain(){inta[100],i,k=1,count,q;for(i=0;k!=0;i++){scanf("%d",&k);a[i]=k;}count=i-2;for(i=0;i<=count;i++){q=a[i];fun(q);}return0;}9.10子串反序--递归请编写一个递归函数reverse(charstr[],intstart,intend),该函数的功能是将串str中下标从start开始到end结束的字符颠倒顺序。假设start和end都在合理的取值范围。例如:执行前:str[]="0123456";start=1;end=4执行后:strr[]="0432156"要求在该函数中不使用新的数组,没有循环。#include<stdio.h>voidreverse(charstr[],intstart,intend){//请完成此函数}intmain(){charstr[100];intstart,end;gets(str);scanf("%d%d",&start,&end);reverse(str,start,end);printf("%s\n",str);return0;}#include<stdio.h>voidreverse(charstr[],intstart,intend){inti,j=0;for(i=0;i<=(end-start-1)/2;i++){j=str[start+i];str[start+i]=str[end-i];str[end-i]=j;}}intmain(){charstr[100];intstart,end;gets(str);scanf("%d%d",&start,&end);reverse(str,start,end);printf("%s\n",str);return0;}7.1数的合并请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a的十位和个位依次存放在c数的十位和千位上,b的十位和个位依次存放在c数的个位和百位上。例如:当a=45,b=12,调用该函数后,c=5241。部分源程序如下,只需要完成fun函数的编写即可。#include<stdio.h>voidfun(inta,intb,int*c){//只需要完成此函数的功能即可}intmain(){inta,b,c;scanf("%d%d",&a,&b);fun(a,b,&c);printf("%d\n",c);}#include<stdio.h>voidfun(inta,intb,int*c){*c=(a/10)*10+(a%10)*1000+(b/10)*1+(b%10)*100;}intmain(){inta,b,c;scanf("%d%d",&a,&b);fun(a,b,&c);printf("%d\n",c);}7.2数组中奇偶数请编一个函数fun(int*a,intn,int*odd,int*even),函数的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参n给了数组中数据的个数:利用指针odd返回奇数之和,利用指针even返回偶数之和。例如:数组中的值依次为:1,8,2,3,11,6;则利用指针odd返回奇数之和15;利用指针even返回偶数之和16。部分程序源码如下。#include<stdio.h>#defineN20voidfun(int*a,intn,int*odd,int*even){//只需要完成此处代码即可}intmain(){inta[N],i,n,odd,even;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);fun(a,n,&odd,&even);printf("Thesumofoddnumbers:%d\n",odd);printf("Thesumofevennumbers:%d\n",even);return0;}#include<stdio.h>#defineN20voidfun(int*a,intn,int*odd,int*even){inti;int*p;*odd=0;*even=0;for(p=a,i=0;i<n;i++){if(*(p+i)%2==0)*even=*even+*(p+i);if(*(p+i)%2!=0)*odd=*odd+*(p+i);}}intmain(){inta[N],i,n,odd,even;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);fun(a,n,&odd,&even);printf("Thesumofoddnumbers:%d\n",odd);printf("Thesumofevennumbers:%d\n",even);return0;}7.3浮点数四舍五入请编一个函数voidfun(doublea,double*h),函数的功能是对变量h中的值保留2位小数,并对第三位进行四舍五入(规定h中的值为正数)。例如:h值为8.32433,则函数返回8.32;h值为8.32533,则函数返回8.33。部分程序源码如下。#include<stdio.h>voidfun(doublea,double*h){//只需要完成此函数的功能即可}intmain(){doublea,h;scanf("%lf",&a);fun(a,&h);printf("Theresult:%lf\n",h);return0;}#include<stdio.h>voidfun(doublea,double*h){//只需要完成此函数的功能即可inti,t;t=(int)(a*1000);if(t%10<5)*h=((double)((int)(a*100)))/100;if(t%10>=5)*h=((double)((int)(a*100)+1))/100;}intmain(){doublea,h;scanf("%lf",&a);fun(a,&h);printf("Theresult:%lf\n",h);return0;}7.4字符移动请编一个函数voidfun(char*s),函数的功能是把字符串中所有的字符前移一个位置,串中的第一个字符移到最后。例如:原有的字符串为:Mn.123xyZ,则调用该函数后,串中的内容为:n.123xyZM。部分程序源码如下:#include<stdio.h>#defineN81voidfun(char*s){//只需要完成此处代码即可}intmain(){chara[N];gets(a);fun(a);printf("%s\n",a);}#include<stdio.h>#defineN81voidfun(char*s){//只需要完成此处代码即可char*p,t;t=*s;p=s+1;for(;*s!='\0';s++,p++)*s=*p;*(s-1)=t;}intmain(){chara[N];gets(a);fun(a);printf("%s\n",a);}7.5生成新数给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。例如,输入一个数:27638496,新的数:为739。部分源程序如下:#include<stdio.h>voidfun(int*n){//只需要完成此部分功能即可}intmain(){intn=-1;while(n>99999999||n<0){scanf("%ld",&n);}fun(&n);printf("%d\n",n);return0;}#include<stdio.h>#include<math.h>voidfun(int*n){//只需要完成此部分功能即可inta[10],b[10];intp=0;inti,j=0,t,k,r,count=0;for(i=0;*n!=0;i++){a[i]=*n%10;*n=*n/10;count++;}//printf("%d\n",count);//for(k=0;k<count;k++)//printf("%d",a[k]);//printf("\n");for(i=0;i<=count-1;i++){if(a[i]%2!=0){b[j]=a[i];j++;}}//printf("%d\n",j);//for(t=0;t<=j-1;t++)//printf("%d",b[t]);//printf("\n");for(r=j-1;r>=0;r--){p=p+b[r]*pow(10,r);}*n=p;}intmain(){intn=-1;while(n>99999999||n<0){scanf("%ld",&n);}fun(&n);printf("%d\n",n);return0;}7.6字符串转换成整数请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数。例如,若输入字符串"-1234",则函数把它转换为整数值-1234。函数fun中给出的语句仅供参考。部分源程序如下:#include<stdio.h>#include<string.h>intfun(char*p){//只需要完成此处功能即可}intmain()/*主函数*/{chars[6];intn;gets(s);n=fun(s);printf("%d\n",n);return0;}#include<stdio.h>#include<string.h>#include<math.h>intfun(char*p){//只需要完成此处功能即可inti,n=0,flag=0,j=0,t,k;inta[10];for(i=0;*(p+i)!='\0';i++){if(*p=='-')flag=1;if(*(p+i)>='0'&&*(p+i)<='9'){a[j]=*(p+i)-48;j++;}}//printf("%d\n",j);//for(k=0;k<=j-1;k++)//printf("%d",a[k]);//printf("\n");for(t=0;t<=j-1;t++){n=n+a[t]*pow(10,j-1-t);}n=n*pow(-1,flag);return(n);}intmain()/*主函数*/{chars[6];intn;gets(s);n=fun(s);printf("%d\n",n);return0;}7.7二维数组按列优先存放请编写函数fun,函数的功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。例如,二维数组中的数据为:WWWWSSSSHHHH则字符串中的内容应是:WSHWSHWSHWSH。部分源程序如下:#include<stdio.h>#defineM3#defineN4voidfun(chars[][N],char*b){//只需要完成此部分功能即可}intmain(){chara[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}};fun(w,a);puts(a);return0;}#include<stdio.h>#defineM3#defineN4voidfun(chars[][N],char*b){//只需要完成此部分功能即可inti,j,t=0,k,q;charc[12];for(j=0;j<100;j++){*(b+j)=0;}for(j=0;j<=3;j++)for(i=0;i<=2;i++){c[t]=s[i][j];t++;}//for(k=0;k<t;k++)//printf("%c",c[k]);//printf("\n");for(q=0;q<t;q++){*(b+q)=c[q];}}intmain(){chara[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}};fun(w,a);puts(a);return0;}选做T7.1数组元素移动请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。部分源程序如下:#include<stdio.h>#defineN80voidfun(int*w,intp,intn){//只需要完成此部分功能即可}intmain(){inta[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};inti,p,n=15;scanf("%d",&p);fun(a,p,n);for(i=0;i<n;i++)printf("%3d",a[i]);printf("\n");return0;}#include<stdio.h>#defineN80voidfun(int*w,intp,intn){//只需要完成此部分功能即可inti,j=0;intb[N],a[15];for(i=0;i<=14;i++)a[i]=*(w+i);for(i=p+1;i<=14;i++){b[j]=a[i];j++;}for(i=0;i<j;i++)*(w+i)=b[i];for(i=0;i<=p;i++)*(w+j+i)=a[i];}intmain(){inta[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};inti,p,n=15;scanf("%d",&p);fun(a,p,n);for(i=0;i<n;i++)printf("%3d",a[i]);printf("\n");return0;}选做T7.2字符串匹配给定程序中函数fun的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。请改正函数fun中指定部位的错误,使它能得出正确的结果。只能改/*********found**********/的下一行。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。给定源程序:#include<stdio.h>#include<string.h>#defineN80intfun(char*s,char*t){intn;char*p,*r;n=0;while(*s){p=s;/*********found**********/r=p;while(*r)if(*r==*p){r++;p++;}elsebreak;/*********found**********/if(*r=0)n++;s++;}returnn;}intmain(){chara[N],b[N];intm;gets(a);gets(b);m=fun(a,b);printf("m=%d\n",m);return0;}#include<stdio.h>#include<string.h>#defineN80intfun(char*s,char*t){intn;char*p,*r;n=0;while(*s){p=s;/*********found**********/r=t;while(*r)if(*r==*p){r++;p++;}elsebreak;/*********found**********/if(*r=='\0')n++;s++;}returnn;}intmain(){chara[N],b[N];intm;gets(a);gets(b);m=fun(a,b);printf("m=%d\n",m);return0;}选做T7.3形成新的字符串给定程序MODI1.C中函数fun的功能是:将s所指字符串中位于奇数位置的字符或ASCII码为偶数的字符放入t所指数组中(规定第一个字符放在第0位中)。例如,字符串中的数据为:AABBCCDDEEFF,则输出应当是:ABBCDDEFF。请改正函数fun中指定部位的错误,使它能得出正确的结果。只能修改/***********found**********/的下一行。注意:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国树脂砂轮数据监测研究报告
- 2025至2030年中国微波接口数据监测研究报告
- 2025至2030年中国强捻素色针织布数据监测研究报告
- 洗车场装修合同解除
- 2025年中国雄风1号橡胶抗生素瓶塞市场调查研究报告
- 2025年中国起绒梭织衬衣市场调查研究报告
- 食品冷链配送服务协议
- 2025年中国油漆筷市场调查研究报告
- 时尚店铺装修贷款协议书
- 垃圾清运调度服务协议
- 【公开课】同一直线上二力的合成+课件+2024-2025学年+人教版(2024)初中物理八年级下册+
- 高职组全国职业院校技能大赛(婴幼儿照护赛项)备赛试题库(含答案)
- 2024年公安部直属事业单位招聘笔试参考题库附带答案详解
- NB-T 47013.15-2021 承压设备无损检测 第15部分:相控阵超声检测
- 装饰工程施工技术ppt课件(完整版)
- SJG 05-2020 基坑支护技术标准-高清现行
- 汽车维修价格表
- 司炉岗位应急处置卡(燃气)参考
- 10KV供配电工程施工组织设计
- 终端拦截攻略
- 药物外渗处理及预防【病房护士安全警示教育培训课件】--ppt课件
评论
0/150
提交评论