目录
- 7-21 打妖怪
- 7-22 统计连续高温的最大天数
- 7-23 唱歌比赛打分
- 7-24 找最长的字符串
- 7-25 算龙脉
- 7-26 DNA鉴定
- 7-28 T9键盘
- 7-31 单链表的创建,遍历与销毁
- 7-36 有多少位是7?
- 7-37 选择排序
- 7-38 翻转单词顺序
- 7-39 求因子和最大的数(结构体排序)
- 7-40 按因子和排序(结构体排序)
7-21 打妖怪
话说孙大圣保唐僧西天取经,路上遇到一妖怪。妖怪共有 v 滴血,大圣每打一棒就能使妖怪失去 h 滴血,妖怪的血小于10滴,就会立即死去。大圣打了 n 棒将妖怪打死。
请编写程序,输入v 和 h,输出n。假设 v 远远大于 10
输入格式:
v 和 h
输出格式:
n
注:题目保证 v、h 和 n 的值都在 int 类型的表示范围内。
输入样例:
在这里给出一组输入。例如:
2510 1000
输出样例:
在这里给出相应的输出。例如:
3
#include <stdio.h>
#include <math.h>
int main(){
int v,h;scanf("%d %d",&v,&h);
double ans;
if(v%h<10){
ans=v*1.0/h;
}else{
ans=ceil(v*1.0/h);
}
printf("%.0f",ans);
return 0;
}
7-22 统计连续高温的最大天数
温度大于等于40度,即认为是高温天气。
输入格式:
第一行是一个n,表示待输入的天数,1<=n<=100000。
第二行开始有n个温度(假定温度都为正整数),中间用空格隔开。
输出格式:
输出连续高温的最大天数。(如果没有一天是高温,则输出0)
输入样例:
在这里给出一组输入。例如:
10
35 40 42 39 40 42 41 43 37 43
输出样例:
在这里给出相应的输出。例如:
4
#include <stdio.h>
int a[100009];
int main()
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int ans=0;
int cnt=0;
for(int i=0;i<n;i++){
int cnt=0;
while(a[i]>=40) {
cnt++;
i++;
}
if(cnt>ans) ans=cnt;
}
printf("%d",ans);
return 0;
}
7-23 唱歌比赛打分
学校进行歌唱比赛。每位选手演唱完毕后,由十位评委打分(分数为整数,满分100分)。
评分规则是,去掉一个最高分,去掉一个最低分,计算其他八位评委的平均分。
输入格式:
在一行中,输入十位评委给出的分数,空格隔开。
输出格式:
去掉一个最高分,去掉一个最低分,计算其他八位评委的平均分。结果保留一位小数。
输入样例:
在这里给出一组输入。例如:
100 73 78 95 86 93 88 87 89 72
输出样例:
在这里给出相应的输出。例如:
86.1
#include <stdio.h>
#include <stdlib.h>
int cmp(const void* e1,const void* e2){
return *(int*)e1 - *(int*)e2;
}
int a[10];
int main()
{
for(int i=0;i<10;i++) scanf("%d",&a[i]);
qsort(a,10,sizeof(int),cmp);
// for(int i=0;i<10;i++) printf("%d ",a[i]);
int sum=0;
double ans;
for(int i=1;i<9;i++){
sum+=a[i];
}
ans=sum*1.0/8;
printf("%.1f\n",ans);
return 0;
}
7-24 找最长的字符串
本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最长的字符串:
The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。
输入样例:
5
li
wang
zhang
jin
xiang
输出样例:
The longest is: zhang
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Str{
char ch[109];
int len;
};
int cmp(const void* e1,const void* e2){
return ((struct Str*)e2)->len - ((struct Str*)e1)->len;
}
int main(){
struct Str S[1009];
int n;scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%s",S[i].ch);
S[i].len=strlen(S[i].ch);
}
qsort(S,n,sizeof(struct Str),cmp);
printf("The longest is: %s",S[0].ch);
return 0;
}
7-25 算龙脉
在中国古代,群龙聚会是常有的事,一个龙群的实力,往往由这个龙群的龙脉的强弱决定,但一群龙的龙脉的计算却是十分困难而且保密的工作,原因是,在龙群中,每条龙的实力,往往由一系列数字表示,如在有n条龙的龙群中,每条龙的实力,就有n个数,这样就构成了一个n*n的矩阵,所谓龙群的实力,就是这个矩阵上两个对角线上所有数值之和,现在要求,从键盘上输入一个数n,然后再输入n行数据,每行数据有n个整数,请您编写程序,输出该龙脉的值。
输入样例:
在这里给出一组输入。例如:
4
1 2 3 1
1 1 2 3
1 2 3 5
2 3 4 5
输出样例:
在这里给出相应的输出。例如:
17
#include <stdio.h>
int a[109][109];
int main()
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)scanf("%d",&a[i][j]);
}
int sum=0;
// if(n%2!=0){
// sum-=a[(n-1)/2][(n-1)/2];
// }
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
{
if(i==j || i+j==n-1) sum+=a[i][j];
}
}
printf("%d",sum);
}
7-26 DNA鉴定
DNA鉴定,在医学上主要是比较两个样本的基因序列的相似程度,但在我们计算机中,对字符串的处理,也可以参考DNA鉴定的方式,比较两个字符串的相似值。如果两个字符串相似程度越高,我们就认为这两个字符串就越相似,具体比较思路如下:给定两个字符串A,B,通过算法判断这两个字符串中相同字符的个数是多少。例:face 和areas 这两个字符串的相似度就是2
例:从屏幕上输入两行,每一行代表一个字符串(中间没有空格,全是英文字母,不区分大小写)。
输入样例:
在这里给出一组输入。例如:
face
areas
输出样例:
在这里给出相应的输出。例如:
2
#include <stdio.h>
#include <string.h>
int cmp(const void* e1,const void* e2){
return *(char*)e1 - *(char*)e2;
}
int main(){
char str1[109];
char str2[109];
gets(str1);
gets(str2);
// printf("%s\n",str1);
// printf("%s",str2);
// 先对str1去重 -> str3
char str3[109];
int index=0;
qsort(str1,strlen(str1),sizeof(char),cmp);
for(int i=0;str1[i]!='\0';i++){
if(str1[i]!=str1[i+1]) str3[index++]=str1[i];
}
// printf(str3);
int ans=0;
for(int i=0;str3[i]!='\0';i++){
for(int j=0;str2[j]!='\0';j++) {
if(str3[i]==str2[j]) {
ans++;
break;
}
}
}
printf("%d",ans);
return 0;
}
7-28 T9键盘
在iPhone和Android大行其道之后,几乎所有的智能手机都配上了大屏幕,用手指直接戳屏幕来输入文字。在这之前,需要通过键盘来输入文字的手机上,T9键盘是不折不扣的王者。
过去风靡全球的T9键盘外观的通常外观如下图:
如果人们需要键入”GALAXY”,那他们需要以如下顺序敲击键盘:4-2-5-2-9-9;在单手操作键盘是输入这个字串最少所需要移动手指的次数就是4次(一开始将手指放在4上不计入移动次数中)
现在给你一个仅包含大写字母的字符串,请你计算单手操作T9键盘键入该字符串最少所需要移动手指的次数。
输入格式:
输入第一行一个整数T(T<=50)代表输入数据组数
每组数据一行,一个字符串s表示待输入的字符串,该字符串由大写字母组成,且长度不超过50。
输出格式:
每组输出一行;首先输出Case #C:(C代表数据编号,从1开始直至T);紧跟一个空格符后输出键入该字符串最少所需要移动手指的次数。
输入样例:
在这里给出一组输入。例如:
3
GALAXY
ABC
ADGJM
输出样例:
在这里给出相应的输出。例如:
Case #1: 4
Case #2: 0
Case #3: 4
#include <stdio.h>
int main(){
int t;scanf("%d",&t);
int time=0;
while(t--){
char str[59];
scanf("%s",str);
getchar();
int count=0;
for(int i=0;str[i]!='\0';i++){
if((str[i]=='A' ||str[i]=='B' || str[i]=='C') &&
(str[i+1]=='A' ||str[i+1]=='B' || str[i+1]=='C')) continue;
else if((str[i]=='D' ||str[i]=='E' || str[i]=='F') &&
(str[i+1]=='D' ||str[i+1]=='E' || str[i+1]=='F')) continue;
else if((str[i]=='G' ||str[i]=='H' || str[i]=='I') &&
(str[i+1]=='G' ||str[i+1]=='H' || str[i+1]=='I')) continue;
else if((str[i]=='J' ||str[i]=='K' || str[i]=='L') &&
(str[i+1]=='J' ||str[i+1]=='K' || str[i+1]=='L')) continue;
else if((str[i]=='M' ||str[i]=='N' || str[i]=='O') &&
(str[i+1]=='M' ||str[i+1]=='N' || str[i+1]=='O')) continue;
else if((str[i]=='P' ||str[i]=='Q' || str[i]=='R' || str[i]=='S') &&
(str[i+1]=='P' ||str[i+1]=='Q' || str[i+1]=='R' || str[i+1]=='S')) continue;
else if((str[i]=='T' ||str[i]=='U' || str[i]=='V') &&
(str[i+1]=='T' ||str[i+1]=='U' || str[i+1]=='V')) continue;
else if((str[i]=='W' ||str[i]=='X' || str[i]=='Y' || str[i]=='Z') &&
(str[i+1]=='W' ||str[i+1]=='X' || str[i+1]=='Y' || str[i+1]=='Z')) continue;
count++;
}
printf("Case #%d: %d\n",++time,count-1);
}
return 0;
}
7-31 单链表的创建,遍历与销毁
从键盘输入任意多个正整数,输入以-1结束。逆序输出这些整数(不包括-1)。
提示:
1、逆序创建单链表。结点数据域是整型数。每输入一个整数,向链表中插入一个结点。当输入-1时结束链表的创建。
2、遍历链表,输出结点数据域的值。
3、遍历完成后,要求销毁该链表。
输入格式:
任意多的正整数,输入序列以-1结束。
输出格式:
逆序输出这些整数(不包括-1)。
输入样例:
在这里给出一组输入。例如:
3 8 2 9 7 4 -1
输出样例:
在这里给出相应的输出。例如:
4 7 9 2 8 3
#include <stdio.h>
int a[100009];
int main(){
int i=0;
while(scanf("%d",&a[i]) && a[i]!=-1){
i++;
}
for(int s=i-1;s>=0;s--)
printf("%d ",a[s]);
return 0;
}
7-36 有多少位是7?
从键盘读入一个4位数的整数,求该数中有多少位是7
输入格式:
一个4位数的整数
输出格式:
该整数中7的个数
输入样例:
在这里给出一组输入。例如:
4757
输出样例:
在这里给出相应的输出。例如:
2
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
int ans=0;
while(n){
int x=n%10;
n/=10;
if(x==7) ans++;
}
printf("%d",ans);
return 0;
}
7-37 选择排序
本题要求从键盘读入n个整数,对这些数做选择排序。输出选择排序每一步的结果和最终结果。
输入格式:
输入的第一行是一个正整数n,表示 在第二行中会有n个整数。
输出格式:
输出选择排序每一步的结果和最终结果。
输入样例:
在这里给出一组输入。例如:
5
3 7 2 9 1
输出样例:
在这里给出相应的输出。例如:
step 1: 1 7 2 9 3
step 2: 1 2 7 9 3
step 3: 1 2 3 9 7
step 4: 1 2 3 7 9
sorted array: 1 2 3 7 9
注意:
输出的冒号 : 是英文输入法下的符号,冒号后有一个空格。每个整数后有一个空格。
#include <stdio.h>
void print(int arr[], int n, int t) {
printf("step %d: ", t);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void printS(int arr[], int n) {
printf("sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void SelectSort(int a[], int n) {
int time = 1;
for (int i = 0; i < n - 1; i++) {
int min = a[i], min_Index = i, flag = 0;
for (int j = i + 1; j < n; j++) {
if (a[j] < min) {
min = a[j];
min_Index = j;
// flag = 1; // 此趟有交换,此题不考虑
}
}
// if (flag) {
int temp = a[i];
a[i] = a[min_Index];
a[min_Index] = temp;
print(a, n, time);
time++;
// }
}
// 输出排序完成后的数组
printS(a, n);
}
int main() {
int n;
scanf("%d", &n);
int a[1000];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
SelectSort(a, n);
return 0;
}
7-38 翻转单词顺序
给定一个字符串,翻转该字符串,翻转时单词中的字符顺序不变。例如,如果字符串为"Hello World",则翻转后为"World Hello"。单词间以一个或多个空格分隔。注意,字符串开头和结尾都可能有多个空格。输出时去掉多余的空格。只在每个单词之间以1个空格间隔。输出的每行末尾没有空格。
输入格式:
输入可能包括多行。每行代表一个字符串,除了空格外,标点符号和普通字母一样处理。你可以认为一行的字符总数不会超过50000个,单词数不会超过600,每个单词的长度也不会超过30。
输出格式:
输出包括多行,每行对应输入的一行,为翻转后的字符串。输出时去掉多余的空格。只在每个单词之前以1个空格间隔。输出的每行末尾没有空格。
输入样例:
在这里给出一组输入。例如:
student. a am I
World Hello
输出样例:
在这里给出相应的输出。例如:
I am a student.
Hello World
// 方法一
#include <stdio.h>
#include <string.h>
// 先整体逆置,再每个单词逆置,适用于无多余空格的情况
void reverse(char str[],int l,int r){
while(l<r){
char temp=str[l];
str[l]=str[r];
str[r]=temp;
l++;r--;
}
}
char str[50009];
int main(){
while(gets(str)){
// getchar();
// 整体逆置
int n=strlen(str);
reverse(str,0,n-1);
// 每个单词的逆置
for(int i=0;str[i]!='\0';i++){
int len=0;
int j=i;
while(str[j]!=' ' && str[j]!='\0'){
len++;
j++;
}
reverse(str,i,i+len-1);
i+=len;
}
// 去除多余的空格
// 缩小左右边界
char ans[50009];
int index=0;
int l=0,r=n-1;
while(str[l]==' ')l++;
while(str[r]==' ')r--;
int flag=1;
for(int i=l;i<=r;i++){
if(str[i]==' ' && flag==1){
ans[index++]=str[i];
flag=0;
}else if(str[i]!=' '){
ans[index++]=str[i];
flag=1;
}
}
ans[index]='\0';
for(int i=0;ans[i]!='\0';i++) printf("%c",ans[i]);
printf("\n");
}
return 0;
}
// 方法二
#include <stdio.h>
#include <string.h>
int main(){
char str[50009];
while(gets(str)){
// getchar();
int n=strlen(str);
char* p=str+n-1;
int flag=1;
while(n>=1){
int count=0;
while(*p==' ' && n>=1){*p='\0';p--;n--;}
while(*p!=' ' && n>=1){p--;n--;count++;}
if(count>=1 && flag){
printf("%s",p+1);
flag=0;// 单词间的空格
}
else if(count>=1 && !flag)printf(" %s",p+1);
}
printf("\n");
}
return 0;
}
7-39 求因子和最大的数(结构体排序)
我们定义正整数的因子和指1个正整数的因子中,不包括自己的其它所有因子之和。例如,4的因子和是1+2=3,6的因子和是1+2+3=6,7的因子和是1,8的因子和是1+2+4=7,9的因子和是1+3=4。我们约定1的因子和是0。
本题要求你编程求一组正整数中因子和最大的数。
输入格式:
输入包括2行。
第一行是1个正整数n,表示第2行会有n个正整数。
输出格式:
输出第2行的n个正整数中因子和最大的那个数。
输入样例:
5
4 6 7 8 9
输出样例:
8
#include <stdio.h>
typedef struct MaxNum{
int num;
int sum;
}Max;
int cmp(const void* e1,const void* e2){
const Max* a=(const Max*)e1;
const Max* b=(const Max*)e2;
return b->sum - a->sum;
// return ((Max*)e2)->sum - ((Max*)e1)->sum;
}
int main(){
Max m[1009];
int n;scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&m[i].num);
for(int i=0;i<n;i++){
int count=0;
for(int j=1;j<m[i].num;j++){
if(m[i].num%j==0) count+=j;
}
m[i].sum=count;
}
qsort(m,n,sizeof(Max),cmp);
printf("%d",m[0].num);
return 0;
}
7-40 按因子和排序(结构体排序)
我们定义正整数的因子和是不包括自己的其它所有因子之和。例如,4的因子和是1+2=3,6的因子和是1+2+3=6,7的因子和是1,8的因子和是1+2+4=7,9的因子和是1+3=4。我们约定1的因子和是0。要求你编写程序,对一组正整数,按每个数因子和的大小,从小到大排序。测试数据保证输入的所有正整数因子和都各不相同。
输入格式:
输入有2行。第一行是一个正整数n,表示第二行会有n个正整数。第二行的每个正整数之间以空格隔开。
输出格式:
按因子和的大小从小到大输出n个正整数。每个数的输出包括该数和该数的因子和,因子和包括在一对小括号中。每个输出之后加入1个空格。
输入样例:
5
9 6 7 4 8
输出样例:
7(1) 4(3) 9(4) 6(6) 8(7)
#include <stdio.h>
#include <stdlib.h>
struct Sum{
int num;
int s;
};
int cmp(const void* e1,const void* e2){
struct Sum* a=(struct Sum*)e1;
struct Sum* b=(struct Sum*)e2;
return a->s - b->s;
}
int main(){
struct Sum arr[1009];
int n;scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&arr[i].num);
// 求因子和
int sum;
for(int i=0;i<n;i++){
sum=0;
for(int j=1;j<arr[i].num;j++){
if(arr[i].num%j==0) sum+=j;
}
arr[i].s=sum;
}
qsort(arr,n,sizeof(struct Sum),cmp);
for(int i=0;i<n;i++) printf("%d(%d) ",arr[i].num,arr[i].s);
return 0;
}