您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > C语言初学者习题-(2)
实验八综合应用(一)实验目的:1、综合使用数组、函数、指针和结构体,解决一些简单问题。一、摆动数列已知递推数列:试求该数列的第n项,并统计出前n项哪些项最大,最大值是多少?本题有多组测试数据,第一行是测试数据组数T,下面T行的每一行有一个整数n,表示所求的项。1=n=50000。输出共有T行,依次对应输入行。每行第一个数是第n项值,第2个数是前n项的最大值,紧接是数m,表示取最大值的项数,随后是m项的下标,注意每个数后应有一个空格。150011552341427#includestdio.h#defineN50001intmain(void){intT,n,a[N],b[N];inti,j,k,max;freopen(1.in,r,stdin);freopen(1.out,w,stdout);scanf(%d,&T);a[1]=1;for(i=0;iT;i++){scanf(%d,&n);max=1;//先认为第1个数最大for(j=2;j=n;j++)//求出前n个数{if(j%2==0)a[j]=a[j/2];elsea[j]=a[(j-1)/2]+a[(j+1)/2];if(maxa[j])//同时找最大的数max=a[j];}k=0;for(j=1;j=n;j++)//然后查找等于最大数的项if(a[j]==max)b[k++]=j;printf(%d%d%d,a[n],max,k);//k即为等于最大数的项for(j=0;jk;j++)printf(%d,b[j]);printf(\n);}return0;}二、能被3和11整除吗读入一个整数,判断该数能否被3和11整数。注意该数可能很大,它的范围为[0,10^200]。有多组测试数据。输入的第一行是整数T(0T=200),表示测试数据的组数。每一组测试数据只有一行,即为要判断的整数。该行没有其它多余的符号。对应每组输入,输出一行判断的结果,第一个单词(”yes”或”no”)表示该数能否被3整除,第二个单词(”yes”或”no”)表示该数能否被11整除,两个字符串之间用一个空格隔开。该行不能有其它多余的符号。2289627824277658778257401nonoyesno#includestdio.h#includestring.hintmain(){charstr[210];inti,T,len,esum,osum;freopen(1.in,r,stdin);freopen(1.out,w,stdout);scanf(%d,&T);while(T--){scanf(%s,str);len=strlen(str);esum=osum=0;for(i=0;ilen;i++){if(i%2==0)osum+=str[len-i-1]-'0';elseesum+=str[len-i-1]-'0';}printf(%s%s\n,((osum+esum)%3==0)?yes:no,((osum-esum)%11==0)?yes:no);}return0;}三、对顶三角形写一个函数,生成对顶三角形,本题目要求不用全局变量。有多组测试数据。输入的第一行是整数T(0T=100),表示测试数据的组数。每一组测试数据只有一行,分别是三角形的腰长n和构成三角形的字符ch,两者之间有一个空格。该行没有其它多余的符号。0n=100。对应每组输入,输出一个对顶三角形。每组数据输出后应有一个空行。23*5@******************@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#includestdio.hintmain(){charch;inti,j,n,T;freopen(1.in,r,stdin);freopen(1.out,w,stdout);scanf(%d,&T);while(T--){scanf(%d%c,&n,&ch);for(i=1;i=n;i++){for(j=1;j=i;j++)printf(%c,ch);for(j=1;j=2*n-2*i;j++)printf();for(j=1;j=i;j++)printf(%c,ch);printf(\n);}for(i=n-1;i=1;i--){for(j=1;j=i;j++)printf(%c,ch);for(j=1;j=2*n-2*i;j++)printf();for(j=1;j=i;j++)printf(%c,ch);printf(\n);}printf(\n);}return0;}四、空心矩阵给出一个矩阵,取矩阵的左上角,如下图所示,可以形成一个空心矩阵。你的任务是从任给的矩阵A(m行n列),编程得出空心矩阵。本题有多组测试数据,第一行是测试数据组数T。每组第一行是两个用空格隔开的整数m和n(1=m,n=10),表示下面输入矩阵的行数和列数。紧随其后是m行n列的整数矩阵(矩阵元素均为1位数),每个数后有一个空格,每组数据之间有一个空行。对应每组输入,输出一个空心矩阵,要求每个数后不能有空格,每组数据输出后应有一个空行。134123456782345123432156776523325677651234321#includestdio.h#defineN10intmain(void){intT,m,n,a[N][N];inti,r,c,s;freopen(1.in,r,stdin);freopen(1.out,w,stdout);scanf(%d,&T);for(i=0;iT;i++){scanf(%d%d,&m,&n);for(r=0;rm;r++)//读入矩阵for(c=0;cn;c++)scanf(%d,&a[r][c]);s=(mn)?m:n;//空心矩阵的行数为2s-1for(r=0;r2*s-1;r++)//循环一次输出一行{if(rs)//空心矩阵的上半部分{for(c=0;cn-r;c++)//共n-r个元素printf(%d,a[r][c]);for(;cn+r-1;c++)//n+r-1及以后,又是矩阵元素printf();for(;c2*n-1;c++)printf(%d,a[r][2*n-2-c]);}else//空心矩阵后半部分{for(c=0;c(n-s+1)+(r-s+1);c++)//n-s+1是上半部分最后一行剩下的元素个数printf(%d,a[(s-1)-(r-s+1)][c]);for(;cn+2*s-r-3;c++)//对称位置前就是空格printf();for(;c2*n-1;c++)printf(%d,a[(s-1)-(r-s+1)][2*n-2-c]);}printf(\n);}printf(\n);}return0;}五、易位法字符串解密密码学是一门既古老又年轻的学科。说它古老,是因为早在几千年前,人类就已经有了通信保密的思想,并先后出现了易位法和置换法等加密方法。到了1949年,信息论的创始人香农(C.E.Shannon)论证了由传统的加密方法所获得的密文,几乎是都可攻破的,这使得密码学的研究面临着严重的危机。直至进入20世纪60年代,由于电子技术和计算机技术的迅速发展,以及结构代数、可计算性理论学科研究成果的出现,才使密码学的研究走出困境而进入了一个新的发展时期;特别是美国的数据加密标准DES和公开密钥密码体制的推出,又为密码学的广泛应用奠定了坚实的基础。虽然加密方法很多,但最基本的加密方法只有两种,即易位法和置换法,其它方法大多是基于这两种方法形成的。易位法是按照一定的规则,重新安排明文中的比特或字符的顺序来形成密文,而字符本身保持不变。按易位单位的不同又可分成比特易位和字符易位两种易位方式。前者的实现方法简单易行,并可用硬件实现,主要用于数字通信中;而后者即字符易位法则是利用密钥对明文进行易位后形成密文。具体方法是:假定有一密钥DCAB,其长度为4,字符串为IloveChina,去掉空格,四位四位分组,不足四位时用e补齐。具体见下图所示。输出时转化为大写输出。注意分组时先去掉了空格,取列时按密钥的ASCII码从小到大取,输出时英文字母全转换为了大写。你的任务是把加密后的密文还原为明文。本题有多组输入。第一行数字T表示输入的组数,每一组有两行,第一行是密钥字符串,长度不超过20个(保证字符不重复);第二行是已加密的字符串,不多于1000个。对应每一组,输出有一行,为解密后的字符串。1DCABOHEVIELCAIENILOVECHINAEE#includestdio.h#includestring.hvoidsort(char*s,int*a,intn);intmain(void){chars1[30],s2[1100],t[1100];inti,j,T,a[30],k,k1,k2;freopen(1.in,r,stdin);freopen(1.out,w,stdout);scanf(%d,&T);getchar();//吸收回车符for(i=0;iT;i++){gets(s1);//读入密钥gets(s2);//读入待解密字符串k1=strlen(s1);//得到密钥长度k2=strlen(s2);//得到需要解密的字符串长度if(k2%k1!=0)//k2一定是k1的倍数{printf(Errorinput!);return0;}for(j=0;jk1;j++)//密钥排序用,以便知道排序后的字符原来在第几列a[j]=j;sort(s1,a,k1);//排序后得到取列的顺序for(j=0;jk1;j++)//按加密算法,加密字符串应分为k1段{for(k=0;kk2/k1;k++)//循环上限是每段长度t[a[j]+k*k1]=s2[j*(k2/k1)+k];//放入对应数组位置}for(j=0;jk2;j++)//输出printf(%c,t[j]);printf(\n);}return0;}voidsort(char*s,int*a,intn){inti,j,k,t;charch;for(i=0;in-1;i++)//简单选择排序{k=i;for(j=i+1;jn;j++)if(s[j]s[k])k=j;if(k!=i){ch=s[i];t=a[i];s[i]=s[k];a[i]=a[k];s[k]=ch;a[k]=t;}}}六、统计上机成绩第六次上机有6个题目,题号分别是1038、1039、1040、1041、1042和1043。每个同学都在认真的做。但依然有些同学过的题多,有些同学过的少。有的同学虽然题未过,但程序写出来,也进行了提交。为了了解本次上机的情况,老师规定:1.如果该题一次Accepted(即第一次就通过),则积分100,否则95;2.如果该题PresentationError,则积分90;3.如果该题WrongAnswer,则积分70;4.如果该题CompileError,则积分50。5.每人每题只计算一次,按最高值计算。本题假设:题目提交返回类型只有Accepted、PresentationError、WrongAnswer和CompileError四种。每个同学每次提交的程序都保存在一个文件中,文件的后缀名为c和cc,文件名的格式为:RunID_AuthorID_返回类型_题号.后缀名比如:6890_2910201012_Accepted_1039.cc本题只有一组输入数据。第一行是文件名称的数目T,下面是T行文件名。RunID不超过整数的范围,AuthorID的长度不超过50个字符,T不超过2000。输出有多行,每行对应一个AuthorID(即一个AuthorID只有一行),其后是积分,用空格隔开,最后一行后有一个空行。注意要先按AuthorID从小到大排序(按字符的ASCII码)。36855_Tommy_WrongAnswer_1038.cc70
本文标题:C语言初学者习题-(2)
链接地址:https://www.777doc.com/doc-5890261 .html