《C语言程序设计》基础练习及解析_第1页
《C语言程序设计》基础练习及解析_第2页
《C语言程序设计》基础练习及解析_第3页
《C语言程序设计》基础练习及解析_第4页
《C语言程序设计》基础练习及解析_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

A+B问题(入门)问题描述输入A、B,输出A+B。说明:在“问题描述”这部分,会给出试题的意思,以及所要求的目标。输入格式输入的第一行包括两个整数,由空格分隔,分别表示A、B。输出格式输出一行,包括一个整数,表示A+B的值。样例输入1245样例输出57数据规模与约定-10000<=A,B<=10000。#include<stdio.h>intmain(){inta,b;scanf("%d%d",&a,&b);printf("%d",a+b);return0;}圆的面积(入门)问题描述给定圆的半径r,求圆的面积。输入格式输入包含一个整数r,表示圆的半径。输出格式输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。样例输入4样例输出50.2654825数据规模与约定1<=r<=10000。提示本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4。#include<stdio.h>#include<math.h>#definePIatan(1.0)*4intmain(){intr;scanf("%d",&r);doubles;s=PI*r*r;printf("%.7f\n",s);return0;}序列求和(大整数)问题描述求1+2+3+...+n的值。输入格式输入包括一个整数n。输出格式输出一行,包括一个整数,表示1+2+3+...+n的值。样例输入4样例输出10样例输入100样例输出5050数据规模与约定1<=n<=1,000,000,000#include<stdio.h>intmain(){longlongsum=0,n=0;//__int64longlong型scanf("%I64d",&n);sum=(n+1)*n/2;printf("%I64d\n",sum);return0;}闰年判断(复杂条件)问题描述给定一个年份,判断这一年是不是闰年。当以下情况之一满足时,这一年是闰年:1.年份是4的倍数而不是100的倍数;2.年份是400的倍数。其他的年份都不是闰年。输入格式输入包含一个整数y,表示当前的年份。输出格式输出一行,如果给定的年份是闰年,则输出yes,否则输出no。样例输入2013样例输出no样例输入2016样例输出yes数据规模与约定1990<=y<=2050。#include<stdio.h>usingnamespacestd;intmain(){intyear;while(scanf("%d",&year)!=EOF)if((year%4==0&&year%100!=0)||year%400==0)printf("yes\n");elseprintf("no\n");return0;}Fibonacci数列(取模)问题描述Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。输入格式输入包含一个整数n。输出格式输出一行,包含一个整数,表示Fn除以10007的余数。说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。样例输入10样例输出55样例输入22样例输出7704数据规模与约定1<=n<=1,000,000。#include<stdlib.h>#include<stdio.h>#defineMAXN1000001intn,i,F[MAXN];intmain(){scanf("%d",&n);F[1]=1;F[2]=1;for(i=3;i<=n;++i)F[i]=(F[i-1]+F[i-2])%10007;printf("%d\n",F[n]);return0;}01字串(取模)问题描述对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:0000000001000100001100100请按从小到大的顺序输出这32种01串。输出格式输出32行,按从小到大的顺序每行一个长度为5的01串。样例输出00000000010001000011<以下部分省略>#include<stdio.h>intmain(){inti; for(i=0;i<32;i++){ printf("%d",i%32/16); printf("%d",i%16/8); printf("%d",i%8/4); printf("%d",i%4/2); printf("%d\n",i%2); }return0;}特殊的数字(取模)问题描述153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。输出格式按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ inti,a,b,c; for(i=100;i<1000;i++){ a=i/100; //百位 b=(i%100)/10; //十位 c=i%10; //个位 if(i==pow(a,3)+pow(b,3)+pow(c,3)) cout<<i<<endl; } return0;}特殊回文数(取模,技巧)

问题描述123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n,编程求所有这样的五位和六位十进制数,满足各位数字之和等于n。输入格式输入一行,包含一个正整数n。输出格式按从小到大的顺序输出满足条件的整数,每个整数占一行。样例输入52样例输出899998989989998899数据规模和约定1<=n<=54。#include<stdio.h>intmain(){ intn,x,f,tmp,i,j;scanf("%d",&n);for(f=0,x=10000,i=x+1;i<1000000;i++){if(i>99999)x=100000;if(i%10!=i/x%10||i/10%10!=i*10/x%10||i/100%10!=i*100/x%10)continue;//循环判断前后的数字是否一致for(tmp=0,j=i;j;tmp+=j%10,j/=10);//第2项等价于j!=0if(n==tmp){printf("%d\n",i);f=1;}}return0;}字母图形(数组,技巧)

问题描述利用字母可以组成一些美丽的图形,下面给出了一个例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。输入格式输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。输出格式输出n行,每个m个字符,为你的图形。样例输入57样例输出ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC数据规模与约定1<=n,m<=26。#include<iostream>#include<cmath>usingnamespacestd;intmain(){chara[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";intn,m;cin>>n>>m;for(inti=0;i<n;i++){for(intj=0;j<m;j++)cout<<a[abs(i-j)];cout<<endl;}return0;}数列特征(数组,技巧)问题描述给出n个数,找出这n个数的最大值,最小值,和。输入格式第一行为整数n,表示数的个数。第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。输出格式输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。样例输入513-245样例输出5-211数据规模与约定1<=n<=10000。#include<iostream>usingnamespacestd;intmain(){ intn,i,maxv=-10001,minv=10001,sum=0;//这一行数据很重要 inta[10000]; cin>>n; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++){ maxv=max(maxv,a[i]); minv=min(minv,a[i]); sum+=a[i]; } cout<<maxv<<endl<<minv<<endl<<sum<<endl; return0;}查找整数(数组)问题描述给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。输入格式第一行包含一个整数n。第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。第三行包含一个整数a,为待查找的数。输出格式如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。样例输入61948399样例输出2数据规模与约定1<=n<=1000。#include<stdio.h>intmain(){intn=0,a=0,i=0;intnNum[1000];scanf("%d",&n);for(i=0;i<n;++i)scanf("%d",&nNum[i]);scanf("%d",&a);for(i=0;i<n;++i)if(nNum[i]==a){//找到相等printf("%d\n",i+1);return0;//退出}}printf("-1\n");return0;}杨辉三角形(二维数组,技巧)问题描述杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。下面给出了杨辉三角形的前4行:

1

11

1211331给出n,输出它的前n行。输入格式输入包含一个数n。输出格式输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。样例输入4样例输出1111211331数据规模与约定1<=n<=34。#include<iostream>usingnamespacestd;intmain(){intn,yh[34][34],i,j;cin>>n;for(i=0;i<n;i++){yh[i][0]=1;yh[i][i]=1;for(j=1;j<i;j++)yh[i][j]=yh[i-1][j-1]+yh[i-1][j];}for(i=0;i<n;i++){for(j=0;j<=i;j++){cout<<yh[i][j];if(j<i)cout<<'';}cout<<endl;}return0;}回文数(技巧)

问题描述1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。输出格式按从小到大的顺序输出满足条件的四位十进制数。#include<stdio.h>intmain(){inti,j;inta,b;for(i=1;i<=9;i++)for(j=0;j<=9;j++)printf("%d\n",i*1000+j*100+j*10+i);return0;}时间转换(技巧)问题描述给定一个以秒为单位的时间t,要求用“<H>:<M>:<S>”的格式来表示这个时间。<H>表示时间,<M>表示分钟,而<S>表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。输入格式输入只有一行,是一个整数t(0<=t<=86399)。输出格式输出只有一行,是以“<H>:<M>:<S>”的格式所表示的时间,不包括引号。样例输入0样例输出0:0:0样例输入5436样例输出1:30:36#include<stdio.h>intmain(){intn,a=0,b=0,c=0;scanf("%d",&n);if(n>=3600){a=n/3600;n=n-a*3600;}b=n/60;n-=b*60;c=n;printf("%d:%d:%d",a,b,c);return0;}十进制转十六进制(数组,技巧)问题描述十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。给出一个非负整数,将它表示成十六进制的形式。输入格式输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647输出格式输出这个整数的16进制表示样例输入30样例输出1E#include"stdio.h"intmain(){chara[10];inti=0;intn,temp;scanf("%d",&n);if(n==0)//注意题目要求的n是非负数,要考虑n=0时的情况printf("0\n");while(n>0){temp=n%16;if(temp>=10)a[i++]='A'+temp-10;elsea[i++]=temp+'0';n/=16;} for(intj=i-1;j>=0;j--) printf("%c",a[j]); return0;}十六进制转十进制(数组,技巧)问题描述从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入FFFF样例输出65535#include<iostream>#include<cmath>#include<cstring>usingnamespacestd;intmain(){chars[10000];cin>>s;intlen=strlen(s);longlongintans=0;for(inti=0;i<len;i++){if(s[i]>='A'&&s[i]<='Z')s[i]=int(s[i]-'A')+10+'0';ans+=((s[i]-'0')*(pow(16,len-1-i)));}printf("%I64d\n",ans);return0;}芯片测试(数组,技巧)问题描述有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。给出所有芯片的测试结果,问哪些芯片是好芯片。输入格式输入数据第一行为一个整数n,表示芯片个数。第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i,j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。输出格式按从小到大的顺序输出所有好芯片的编号样例输入3101010101样例输出13分析:因为超过半数的芯片是好的,所以这些芯片对于其他芯片的测试结果是正确的。所以假设该芯片是好芯片,它除了它自身测试自身之外的其他测试结果为好的个数将超过一半。同理,假设该芯片是坏芯片,他将有超过半数的测试结果是坏芯片。所以只要根据每一列的所有测试结果,判断其为好芯片的总数>=n/2的时候,这个芯片就是好芯片。#include<iostream>usingnamespacestd;intmain(){ inti,j,n,a[20][20]; cin>>n; for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>a[i][j]; for(i=0;i<n;i++){ intcnt=0; for(j=0;j<n;j++) if(i!=j) cnt+=a[j][i]; if(cnt>=n/2) cout<<i+1<<""; } return0;}回形取数(二维数组,技巧)问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。输入格式输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。输出格式输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。样例输入33123456789样例输出147896325样例输入32123456样例输出135642#include<iostream>#include<cstring>usingnamespacestd;intmain(){intm,n; inta[202][202];inti,j; cin>>m>>n;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>a[i][j];intsum=m*n;i=-1;j=0;while(sum){ //向下走 while(a[++i][j]!=-1&&i<m){ cout<<a[i][j]<<""; a[i][j]=-1; sum--; } i--;//修正行坐标 //向右走 while(a[i][++j]!=-1&&j<n){ cout<<a[i][j]<<""; a[i][j]=-1; sum--; } j--;//修正列坐标 //向上走 while(a[--i][j]!=-1&&i>=0){ cout<<a[i][j]<<""; a[i][j]=-1; sum--; } i++; //向左走 while(a[i][--j]!=-1&&j>=0){ cout<<a[i][j]<<""; a[i][j]=-1; sum--; } j++;}return0;}报时助手(字符数组,技巧)问题描述给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:如果m为0,则将时读出来,然后加上“o'clock”,如3:00读作“threeo'clock”。如果m不为0,则将时读出来,然后将分读出来,如5:30读作“fivethirty”。时和分的读法使用的是英文数字的读法,其中0~20读作:0:zero,1:one,2:two,3:three,4:four,5:five,6:six,7:seven,8:eight,9:nine,10:ten,11:eleven,12:twelve,13:thirteen,14:fourteen,15:fifteen,16:sixteen,17:seventeen,18:eighteen,19:nineteen,20:twenty。30读作thirty,40读作forty,50读作fifty。对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirtyone”。按上面的规则21:54读作“twentyonefiftyfour”,9:07读作“nineseven”,0:15读作“zerofifteen”。输入格式输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。输出格式输出时间时刻的英文。样例输入015样例输出zerofifteen#include<iostream>#include<string>usingnamespacestd;stringn[100]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","thirty","forty","fifty"};voidass(intnum){inta=num/10;intb=num%10;if(num<=20)cout<<n[num];else{cout<<n[a+18];if(b!=0)cout<<""<<n[b];}}voidtime_ass(inthour,intminu){if(minu==0){ass(hour);cout<<"o'clock"<<endl;}else{ass(hour);cout<<"";ass(minu);cout<<endl;}}intmain(){inth,m;cin>>h>>m;time_ass(h,m);return0;}Huffuman树(排序,技巧)

问题描述Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。给出一列数{pi}={p0,p1,…,pn-1},用这列数构造Huffman树的过程如下:1.找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa

+pb。2.重复步骤1,直到{pi}中只剩下一个数。在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。例如,对于数列{pi}={5,3,8,2,9},Huffman树的构造过程如下:1.找到{5,3,8,2,9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5,8,9,5},费用为5。2.找到{5,8,9,5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8,9,10},费用为10。3.找到{8,9,10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10,17},费用为17。4.找到{10,17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。5.现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。输入格式输入的第一行包含一个正整数n(n<=100)。接下来是n个正整数,表示p0,p1,…,pn-1,每个数不超过1000。输出格式输出用这些数构造Huffman树的总费用。样例输入553829样例输出59#include<iostream>#include<algorithm>usingnamespacestd;intmain(){intn; inta[100];cin>>n;longsum=0;inti,j=0,t=n;for(i=0;i<n;i++) cin>>a[i];while(j<n-1){ sort(a+j,a+n); //排序 sum+=(a[j]+a[j+1]); //费用 a[j+1]+=a[j]; //用最小两项的和覆盖第2较小值 j++; //指针移动到下一个数字 }cout<<sum<<endl; return0;}高精度加法(字符数组,技巧)问题描述输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。算法描述由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。计算c=a+b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。最后将C输出即可。输入格式输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。输出格式输出一行,表示a+b的值。样例输入201001222010012212345678902010012220100122样例输出20100122203011233454668012#include<iostream>#include<string.h>usingnamespacestd;intmain(){chara[1111],b[1111];intc[1111];cin>>a>>b;inti,j,k=0;intr=0;for(i=strlen(a)-1,j=strlen(b)-1;i>=0&&j>=0;i--,j--){intp=(a[i]-'0')+(b[j]-'0')+r;r=p/10; //进位c[k++]=p%10;//余数加到数组中}while(i>=0){//如果a较大intp=(a[i]-'0')+r;r=p/10;c[k++]=p%10;i--;}while(j>=0){//如果b较大intp=(b[j]-'0')+r;r=p/10;c[k++]=p%10;j--;}if(r){//判断最高位有没有进位c[k++]=r;}for(i=k-1;i>=0;i--){//输出最后结果cout<<c[i];}return0;}高精度乘法(字符数组,技巧)#include<stdio.h>#include<string.h>intmain(){charm[555],n[555],temp[555];inti,j,len_m,len_n;inta[555]={0},b[555]={0},c[1111]={0};scanf("%s",m);scanf("%s",n); len_m=strlen(m); len_n=strlen(n); //确保第一个数较大if(len_m<len_n){strcpy(temp,m);strcpy(m,n);strcpy(n,temp);}//分离数字位for(i=0;i<=len_m-1;i++)a[i]=m[len_m-1-i]-'0';for(i=0;i<=len_n-1;i++)b[i]=n[len_n-1-i]-'0';//用第2个数的每一位乘以第1个数的每一位for(i=0;i<len_n;i++)for(j=0;j<len_m;j++)c[i+j]+=a[j]*b[i]; //处理进位for(i=0;i<2*len_m;i++)if(c[i]>=10){c[i+1]+=c[i]/10;c[i]%=10;}i=2*len_m;while(!c[i])i--; //跳过前导0if(i<0)printf("0");elsefor(;i>=0;i--)printf("%d",c[i]);return0;}阶乘计算(数组,技巧)问题描述输入一个正整数n,输出n!的值。其中n!=1*2*3*…*n。算法描述n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。输入格式输入包含一个正整数n,n<=1000。输出格式输出n!的准确值。样例输入10样例输出3628800#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAX4000intmain(){intn,a[MAX],i,j,s,r=0;scanf("%d",&n);memset(a,0,sizeof(a));//全部设置为0a[0]=1;for(i=2;i<=n;i++){for(j=0;j<MAX;j++){s=a[j]*i+r;r=s/10; //进位a[j]=s%10; //当前位}}for(i=MAX-1;i>=0;i--){if(a[i])//遇到第1个非0数字退出break;}for(j=i;j>=0;j--)//倒序输出printf("%d",a[j]);return0;}数的读法(数组)问题描述Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。所以,他迫切地需要一个系统,然后当他输入1234567009时,会给出相应的念法:十二亿三千四百五十六万七千零九用汉语拼音表示为shieryisanqiansibaiwushiliuwanqiqianlingjiu这样他只需要照着念就可以了。你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。注意必须严格按照规范,比如说“10010”读作“yiwanlingyishi”而不是“yiwanlingshi”,“100000”读作“shiwan”而不是“yishiwan”,“2000”读作“erqian”而不是“liangqian”。输入格式有一个数字串,数值大小不超过2,000,000,000。输出格式是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。样例输入1234567009样例输出shieryisanqiansibaiwushiliuwanqiqianlingjiu#include<iostream>usingnamespacestd;intmain(){char*num[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};char*wei[]={"shi","bai","qian","wan","yi"};char*str[20];//存最后结果inti,j,k,n,l[2]={0};i=0;//4位数为一组 j=0;//数组str的下标cin>>n;while(n>0){k=n%10;//n的最后一位数n/=10;if(k>0){if(i>0){if(i>=4&&!l[i/4-1]){//如果是大于等于4位数的数,且已经加了一个wei,那么就不要添加l[i/4-1]=1;str[j++]=wei[i/4+2];}if(i%4!=0){str[j++]=wei[i%4-1];}}str[j++]=num[k];}elseif(j>0&&str[j-1]!=num[0]){//判断连续另个是不是都是0str[j++]=num[0];}i++;}if(!(str[j-1]=="yi"&&j>1&&str[j-2]=="shi"))//去除yishi的情况cout<<str[j-1]<<"";//输出第一位数for(i=j-2;i>=0;i--){//输出剩余的各个字符串cout<<str[i]<<"";}return0;}矩阵乘法(二维数组)问题描述给定一个N阶矩阵A,输出A的M次幂(M是非负整数)例如:A=1234A的2次幂7101522输入格式第一行是一个正整数N、M(1<=N<=30,0<=M<=5),表示矩阵A的阶数和要求的幂数接下来N行,每行N个不超过10的非负整数,描述矩阵A的值输出格式输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开样例输入221234样例输出7101522#include<iostream>usingnamespacestd;//输出矩阵voidprint(intc[][101],intn){ inti,j;for(i=0;i<n;i++){for(j=0;j<n;j++){cout<<c[i][j]<<"";}cout<<endl;}}//矩阵乘法voidmatrix(inta[][101],intb[][101],intc[][101],intn,intm){ intp,i,j,k,t;for(p=1;p<m;p++){for(i=0;i<n;i++){for(j=0;j<n;j++){t=0;for(k=0;k<n;k++){t+=a[i][k]*b[k][j];c[i][j]=t;}}}for(i=0;i<n;i++){for(j=0;j<n;j++){b[i][j]=c[i][j];}}}}intmain(){intn,m,i,j;inta[101][101]={0},b[101][101]={0},c[101][101]={0};cin>>n>>m;for(i=0;i<n;i++)for(j=0;j<n;j++) {cin>>a[i][j]; b[i][j]=a[i][j];}if(!m){for(i=0;i<n;i++)for(j=0;j<n;j++)if(i==j)c[i][j]=1;print(c,n);}elseif(m==1)print(a,n);else{matrix(a,b,c,n,m);print(c,n);}return0;}十六进制转八进制(数组)问题描述给定n个十六进制正整数,输出它们对应的八进制数。输入格式输入的第一行为一个正整数n(1<=n<=10)。接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式输出n行,每行为输入对应的八进制正整数。注意输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。样例输入239123ABC样例输出714435274提示先将十六进制数转换成某进制数,再由某进制数转换成八进制。#include<iostream>#include<string>usingnamespacestd;intmain(){intn=0,i=0,j=0,temp=0,nNum=0;charch;stringstrHex[10];stringstrBin[10];stringstrOct[10];cin>>n;for(i=0;i<n;++i)cin>>strHex[i];//十六进制转二进制for(i=0;i<n;++i){j=0;while(strHex[i][j]){switch(strHex[i][j]){case'0':strBin[i]+="0000";break;case'1':strBin[i]+="0001";break;case'2':strBin[i]+="0010";break;case'3':strBin[i]+="0011";break;case'4':strBin[i]+="0100";break;case'5':strBin[i]+="0101";break;case'6':strBin[i]+="0110";break;case'7':strBin[i]+="0111";break;case'8':strBin[i]+="1000";break;case'9':strBin[i]+="1001";break;case'A':strBin[i]+="1010";break;case'B':strBin[i]+="1011";break;case'C':strBin[i]+="1100";break;case'D':strBin[i]+="1101";break;case'E':strBin[i]+="1110";break;case'F':strBin[i]+="1111";break;default:break;}++j;}}//二进制转化为八进制for(i=0;i<n;++i){j=strBin[i].size()-1;//获得长度while(strBin[i][j]&&j>=0){temp=3;nNum=0;while(temp--&&j>=0){if('1'==strBin[i][j]){switch(temp){case0:nNum+=4;break;case1:nNum+=2;break;case2:nNum+=1;break;default:break;}}--j;}strOct[i]+=(nNum+'0');}}//字符串逆序for(i=0;i<n;++i){temp=strOct[i].size()-1;for(j=0;j<=temp/2;++j){ch=strOct[i][j];strOct[i][j]=strOct[i][temp-j];strOct[i][temp-j]=ch;}}//打印for(i=0;i<n;++i){j=0;while(strOct[i][j++]=='0');//跳过前面的0for(--j;j<strOct[i].size();++j)cout<<strOct[i][j]-'0';cout<<endl;}return0;}数列排序(系统函数)问题描述给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200输入格式第一行为一个整数n。第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式输出一行,按从小到大的顺序输出排序后的数列。样例输入583649样例输出34689#include<stdio.h>#include<algorithm>usingnamespacestd;intmain(){intn,a[200+5];scanf("%d",&n);for(inti=0;i<n;i++)scanf("%d",&a[i]);sort(a,a+n);for(i=0;i<n;i++)printf("%d",a[i]);printf("\n"); return0;}字符串对比(系统函数)问题描述给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:1:两个字符串长度不等。比如Beijing和Hebei2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如Beijing和Beijing3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如beijing和BEIjing4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如Beijing和Nanjing编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。输入格式包括两行,每行都是一个字符串输出格式仅有一个数字,表明这两个字符串的关系编号样例输入BEIjingbeiJing样例输出3#include<iostream>#include<cstring>usingnamespacestd;intmain(){charstr1[11],str2[11];cin>>str1;cin>>str2;if(strlen(str1)!=strlen(str2))cout<<"1";else{if(!strcmp(str1,str2))cout<<"2";elseif(!strcmpi(str1,str2))cout<<"3";elsecout<<"4";}cout<<endl;return0;}矩形面积交(排序,技巧)问题描述平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。输入格式输入仅包含两行,每行描述一个矩形。在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。输出格式输出仅包含一个实数,为交的面积,保留到小数后两位。样例输入11332244样例输出1.00#include<cstdio>#include<algorithm>usingnamespacestd;intmain(){doublex[4];doubley[4]; inti;for(i=0;i<4;i++) scanf("%lf%lf",&x[i],&y[i]); //由于输入的点可能是矩形的主对角线的两个顶点,也可能是副对角线的两个顶点,所以对坐标进行排序,统一成矩形的主对角线上的两个顶点,方便判断相离。sort(x,x+2);sort(x+2,x+4);sort(y,y+2);sort(y+2,y+4); //判断相离的四种方式,即以第一个矩形为中心,另一个矩形在其四周的相离方式。if(x[1]<=x[2]||x[0]>=x[3]||y[0]>=y[3]||y[1]<=y[2]) printf("%.2lf\n",0);else{ //对输入的四个点的横坐标与纵坐标分别进行升序排序sort(x,x+4);sort(y,y+4);printf("%.2lf\n",(x[2]-x[1])*(y[2]-y[1]));}return0;}分解质因数(递归,技巧)问题描述求出区间[a,b]中所有整数的质因数分解。输入格式输入两个整数a,b。输出格式每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)样例输入310样例输出3=34=2*25=56=2*37=78=2*2*29=3*310=2*5提示先筛出所有素数,然后再分解。数据规模和约定2<=a<=b<=10000#include<iostream>#include<cmath>usingnamespacestd;intzs[10001];intk;//递归求因数stringpri(intm){ inti;if(m==1)return"";for(inti=0;i<k;i++){if(m%zs[i]==0){cout<<zs[i];if(m/zs[i]!=1)cout<<"*";returnpri(m/zs[i]);}}}//筛选出质数voidzhishu(inta,intb){inti,j;k=0;for(i=2;i<=b;i++){ints=sqrt(i);for(j=2;j<=s;j++)if(i%j==0)break;if(j>s){zs[k]=i;k++;}}}intmain() {inta,b,i;cin>>a>>b;zhishu(a,b);for(i=a;i<=b;i++){cout<<i<<"=";pri(i);cout<<endl;}return0;}FJ的字符串(递归)问题描述FJ在沙盘上写了这样一些字符串:A1=“A”A2=“ABA”A3=“ABACABA”A4=“ABACABADABACABA”……你能找出其中的规律并写所有的数列AN吗?输入格式仅有一个数:N≤26。输出格式请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。样例输入3样例输出ABACABA#include<iostream>#include<cstdio>usingnamespacestd;voidprint(intn){if(n==1){printf("A");return;}else{print(n-1);//递归printf("%c",'A'+n-1);print(n-1);}}intmain() {intn; scanf("%d",&n);print(n);}完美的代价(贪心思想)问题描述回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。交换的定义是:交换两个相邻的字符例如mamad第一次交换ad:mamda第二次交换md:madma第三次交换ma:madam(回文!完美!)输入格式第一行是一个整数N,表示接下来的字符串的长度(N<=8000)第二行是一个字符串,长度为N,且只包含小写字母输出格式如果可能,输出最少的交换次数。否则输出Impossible样例输入5mamad样例输出3#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;//贪心思想,从左向右遍历,对于当前字符,从最右边向左遍历,找到与当前字符相同的,把它移动到正确位置,累加步数。 //如果字符串长度为偶数,只要有一个无法配对的字符,就不能变成回文串,若为奇数,只要出现两个无法配对的字符,也不能。intmain(){charch[8010];intn,sum=0,ok=1,c=-1;scanf("%d%s",&n,ch);inti,j=n–1,k; //mamad for(i=0;i<=j-1;i++){ //从左向右依次判断 for(k=j;k>=i;k--){//从最右边查找,看有无与当前字符相同的if(k==i){//没有找到与ch[i]相同的字符if(n%2==0||c!=-1){//若n为偶数或ch[i]不是唯一无法匹配的字符ok=0;break;}c=1; //n为奇数,ch[i]为第一个无法匹配的字符sum+=n/2-i;//将它移到中间所需步数break;}if(ch[k]==ch[i]){ //找到相同的 for(intt=k;t<=j-1;t++) ch[t]=ch[t+1];//贪心思想,往后移到对称位置sum+=j-k;j--;break;}}if(!ok)break;}if(!ok)printf("Impossible\n");elseprintf("%d\n",sum);return0;}Sine之舞(技巧)问题描述最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。不妨设An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)Sn=(...(A1+n)A2+n-1)A3+...+2)An+1FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。输入格式仅有一个数:N<

温馨提示

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

评论

0/150

提交评论