第四部分
第二小整数
求n个整数中倒数第二小的数。每一个整数都独立看成一个数,比如,有三个数分别是1,1,3,那么,第二小的数就是1。
- 输入
输入包含多组测试数据。
输入的第一行是一个整数C,表示有C测试数据;
每组测试数据的第一行是一个整数n,表示本组测试数据有n个整数(2<=n<=10),http://www.shfdjk.com接着一行是 n个整数 (每个数均小于100);
- 输出
请为每组测试数据输出第二小的整数,每组输出占一行。
#include <stdio.h>int main(){ int T; int n; int i; int min; int min_flag; int number[11];
scanf("%d",&T);
while(T--){ scanf("%d",&n);
for(i=0;i<n;i++){ scanf("%d",&number[i]);
if(i==0){
min=number[0];
min_flag=0;
}
if(number[i]<min){
min=number[i];
min_flag=i;
}
}
for(i=0;i<n;i++){ if(i!=min_flag){
min=number[i]; break;
}
}
for(i=0;i<n;i++){ if(i!=min_flag &&number[i]<min)
min=number[i];
}
printf("%d\n",min);
}
return 0;
}
奇偶数分离
有一个整型偶数n(2<= n <=10000),你要做的是:先把1到n中的所有奇数从小到大输出,再把所有的偶数从小到大输出。
- 输入
第一行有一个整数i(2<=i<30)表示有 i 组测试数据;每组有一个整型偶数n。 - 输出
第一行输出所有的奇数。第二行输出所有的偶数
#include <stdio.h>int main(){ int T; int i; int n;
scanf("%d",&T);
while(T--){
scanf("%d",&n); for(i=1;i<=n;i++){ if(i%2==1){ if(i==1) printf("%d",i);
else
printf(" %d",i);
}
}
printf("\n");
for(i=1;i<=n;i++){ if(i%2==0){ if(i==2) printf("%d",i);
else
printf(" %d",i);
}
}
printf("\n");
if(T!=0) printf("\n");
} return 0;
}
奇偶位互换
给定一个长度为偶数位的0,1字符串,请编程实现串的奇偶位互换。
- 输入
输入包含多组测试数据;
输入的第一行是一个整数C,表示有C测试数据;
接下来是C组测试数据,每组数据输入均为0,1字符串,保证串长为偶数位(串长<=50)。
- 输出
请为每组测试数据输出奇偶位互换后的结果;每组输出占一行。
#include <stdio.h>#include<string.h>int main(){ int T; char s[51]; int length; char temp; int i;
scanf("%d",&T);
while(T--){ scanf("%s",s);
length=strlen(s);
for(i=0;i<length-1;i+=2){
temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
printf("%s\n",s);
}
return 0;
}
统计硬币
假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。
- 输入
输入数据第一行有一个正整数T,表示有T组测试数据;接下来的T行,每行有两个数n,m,n和m的含义同上。 - 输出
对于每组测试数据,请输出可能的组合方式数;每组输出占一行。
#include <stdio.h>int main(){ int T; int amount; int sum; intone_amount; int two_amount; int five_amount; int a; int b; int c; int result;
scanf("%d",&T);
while(T--){
result=0; scanf("%d%d",&amount,&sum);
one_amount=sum/1;
two_amount=sum/2;
five_amount=sum/5;
for(a=0;a<=one_amount;a++){ for(b=0;b<=two_amount;b++){ for(c=0;c<=five_amount;c++){ if((a+b+c)==amount&& (a*1+b*2+c*5)==sum)
result++;
}
}
} printf("%d\n",result);
}
return 0;
}
汉字统计
统计给定文本文件中汉字的个数。
- 输入
输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。 - 输出
对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
#include <stdio.h>int main(){ int T; char c; int amount;
scanf("%d",&T);
getchar();
while(T--){
amount=0; while((c=getchar())!='\n'){ if(c<0 || c>127)
amount++;
} printf("%d\n",amount/2);
}
return 0;
}
第五部分
偶数求和
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
- 输入
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。 - 输出
对于每组输入数据,输出一个平均值序列,每组输出占一行。
#include <stdio.h>int main(){ int sequence[101]; int i; int j; intn; int m; int result; int remainder; int flag;
for(i=0;i<101;i++)
sequence[i]=(i+1)*2;
while((scanf("%d%d",&n,&m))!=EOF){
result=0;
j=1;
flag=0;
remainder=n%m;
for(i=0;i<=n;i++){ if(j<=m){
result+=sequence[i];
}
else{ if(flag==0) printf("%d",result/m);
else
printf("%d",result/m);
flag=1;
j=1;
result=sequence[i];
}
j++;
}
if(remainder){ printf(" %d",(result-sequence[n])/remainder);
}
printf("\n");
}
return 0;
}
杨辉三角
还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
- 输入
输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<=30),表示将要输出的杨辉三角的层数。 - 输出
对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。
#include <stdio.h>
int main(){ int n; int triangle[31][31]; int i; int j;
while((scanf("%d",&n))!=EOF){ for(i=0;i<31;i++)
for(j=0;j<31;j++)
triangle[i][j]=0;
triangle[0][0]=1;
triangle[1][0]=1;
triangle[1][1]=1;
for(i=2;i<n;i++){
triangle[i][0]=1;
triangle[i][i]=1; for(j=1;j<=i;j++){
triangle[i][j]=triangle[i-1][j]+triangle[i-1][j-1];
}
}
for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(triangle[i][j]!=0){ if(j==0) printf("%d",triangle[i][j]);
else
printf(" %d",triangle[i][j]);
}
}
printf("\n");
}
printf("\n");
}
return 0;
}
统计字符
统计一个给定字符串中指定的字符出现的次数
- 输入
测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串。注意这里的字符串包含空格,即空格也可能是要求被统计的字符之一。当读到'#'时输入结束,相应的结果不要输出。 - 输出
对每个测试用例,统计第1行中字符串的每个字符在第2行字符串中出现的次数,按如下格式输出:
c0 n0
c1 n1
c2 n2
...
其中ci是第1行中第i个字符,ni是ci出现的次数。
#include <stdio.h> #include<string.h>
int main(){
char s1[6]; chars2[81]; int s1_length; int s2_length; inti; int j; int time; char c; while(1){
i=0; //s1包含空格
while((c=getchar())!='\n'){
s1[i]=c;
i++;
}
s1[i]='\0'; if(s1[0]=='#')
break;
i=0; //s2包含空格
while((c=getchar())!='\n'){
s2[i]=c;
i++;
}
s2[i]='\0';
s1_length=strlen(s1);
s2_length=strlen(s2); for(i=0;i<s1_length;i++){
time=0; for(j=0;j<s2_length;j++){ if(s1[i]==s2[j])
time++;
} printf("%c %d\n",s1[i],time);
}
} return 0;
}
完数
完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。
- 输入
输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000) 。 - 输出
对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的完数个数。
#include <stdio.h>int if_perfect_number(intnumber);
int main(){
int T;
int number1;
int number2;
int temp;
int i;
int amount;
scanf("%d",&T);
while(T--){
amount=0;
scanf("%d%d",&number1,&number2);
if(number1>number2){
temp=number1;
number1=number2;
number2=temp;
}
for(i=number1;i<=number2;i++){
if(if_perfect_number(i)==1)
amount++;
}
printf("%d\n",amount);
} return 0;
}
int if_perfect_number(int number){
int i; int sum;
sum=0;
for(i=1;i<=number/2;i++){
if(number%i==0)
sum+=i;
} if(sum==number)
return 1; else
return 0;
}
素数回文
xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);
- 输入
这里有许多组数据,每组包括两组数据a跟b。 - 输出
对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。
#include <stdio.h>#include<string.h>#include <math.h>#define N 10000000 //9999999是题目要求范围的最大回文数charflag[N];int palindrome_number(int number);int main(){ int i; int j; int a; int b; memset(flag,'0',N);
flag[0]='1';
flag[1]='1'; for(i=2;i<=sqrt((double)N);i++){ if(flag[i]=='0'){ for(j=i*i;j<N;j+=i)
flag[j]='1';
}
} while(scanf("%d%d",&a,&b)!=EOF){ for(i=a;i<=b;i++){ if(i>N-1) continue; if(palindrome_number(i)==1&& flag[i]=='0') printf("%d\n",i);
} printf("\n");
} return 0;
}int palindrome_number(int number){ int array[9]; int i; int length; intflag;
i=0; while(number){ array[i]=number%10;
i++;
number/=10;
}
length=i;
flag=0; for(i=0;i<length/2;i++){ if(array[i]!=array[length-i-1]){
flag=1; break;
}
} if(flag==1) return 0; else
return 1;
}
第六部分
快速排序
给你n个整数,请按从大到小的顺序输出其中前m大的数。
- 输入
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。 - 输出
对每组测试数据按从大到小的顺序输出前m大的数。
#include <stdio.h>void quickSort(inta[],int left,int right);int array[1000001];int main(){ int n; int m; int i;
while(scanf("%d%d",&n,&m)!=EOF){ for(i=0;i<n;i++) scanf("%d",&array[i]);
quickSort(array,0,n-1);
for(i=n-1;i>n-m-1;i--){ if(i==n-1) printf("%d",array[i]);
else
printf(" %d",array[i]);
}
printf("\n");
}
return 0;
}void quickSort(int a[],int left,intright){ int i; int j; int temp;
i=left;
j=right;
temp=a[left];
if(left>=right) return;
while(i!=j){ while(i<j && a[j]>=temp)
j--;
if(i<j){
a[i]=a[j];
}
while(i<j&& a[i]<=temp)
i++;
if(i<j){
a[j]=a[i];
}
}
a[i]=temp;
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
开门人和关门人
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签
到、签离记录,请根据记录找出当天开门和关门的人。
- 输入
测试输入的第一行给出记录的总天数N ( > 0 )。下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为
证件号码签到时间 签离时间
其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
- 输出
对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
#include <stdio.h>#include<string.h>int main(){ int N; int M; int i; char ID[16]; char minID[16]; char maxID[16]; char s1[9]; char s2[9]; char time1[7]; char time2[7]; char minTime[7]; char maxTime[7]; scanf("%d",&N); while(N--){ scanf("%d",&M); for(i=0;i<M;i++){ scanf("%s%s%s",ID,s1,s2);
time1[0]=s1[0];
time1[1]=s1[1];
time1[2]=s1[3];
time1[3]=s1[4];
time1[4]=s1[6];
time1[5]=s1[7];
time1[6]='\0';
time2[0]=s2[0];
time2[1]=s2[1];
time2[2]=s2[3];
time2[3]=s2[4];
time2[4]=s2[6];
time2[5]=s2[7];
time2[6]='\0'; if(i==0){ strcpy(minID,ID); strcpy(maxID,ID); strcpy(minTime,time1); strcpy(maxTime,time2); continue;
} if(strcmp(time1,minTime)<0){ strcpy(minID,ID); strcpy(minTime,time1);
} if(strcmp(time2,maxTime)>0){ strcpy(maxID,ID); strcpy(maxTime,time2);
}
} printf("%s %s\n",minID,maxID);
}
return 0;
}
鸡兔同笼
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡和兔的数目,如果无解,则输出“No answer”(不要引号)。
- 输入
第一行输入一个数据a,代表接下来共有几组数据,在接下来的(a<10)、a行里,每行都有一个n和m.(0<m,n<100) - 输出
输出鸡兔的个数,或者No answer
#include <stdio.h> int main(){ int T; int n; int m;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
if((m-2*n)>=0&& (m-2*n)%2==0 && (4*n-m)>=0 && (4*n-m)%2==0) printf("%d %d\n",(4*n-m)/2,(m-2*n)/2);
else
printf("Noanswer\n");
} return 0;
}
日期计算
如题,输入一个日期,格式如:2010 10 24 ,判断这一天是这一年中的第几天。
- 输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每行的输入数据都是一个按题目要求格式输入的日期。 - 输出
每组输入数据的输出占一行,输出判断出的天数n
#include <stdio.h> int main(){ int T; int a; int b; int c; int i; int day[13]; int amount;
day[1]=31;
day[2]=28;
day[3]=31;
day[4]=30;
day[5]=31;
day[6]=30;
day[7]=31;
day[8]=31;
day[9]=30;
day[10]=31;
day[11]=30;
day[12]=31;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&a,&b,&c);
amount=0; for(i=1;i<b;i++)
amount+=day[i];
amount+=c;
if((a%400==0 ||(a%4==0 && a%100!=0)) && i>=3)
amount++;
printf("%d\n",amount);
} return 0;
}
开灯问题
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
- 输入
输入一组数据:n和k - 输出
输出开着的灯编号
#include <stdio.h> #include<string.h>int main(){
int n;
int k;
int flag[1001];
int i;
int j;
scanf("%d%d",&n,&k);
memset(flag,0,sizeof(int)*1001);
for(i=1;i<=k;i++){
for(j=1;j<=n;j++){
if(j%i==0){
if(flag[j-1]==0)
flag[j-1]=1;
else
flag[j-1]=0;
}
}
}
for(i=0;i<n;i++){
if(flag[i]==1){
printf("%d",i+1);
flag[i]=0;
break;
}
}
for(i=0;i<n;i++){
if(flag[i]==1)
printf(" %d",i+1);
}
printf("\n");
return 0;
}