pta初级题库101-150


7-101 计算平均成绩

分数 4
作者 C课程组
单位 浙江大学
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。

输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。

输出格式:
首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。

输入样例:
5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60
输出样例:
80.00
zhang 00001
chen 21987

代码如下(示例):

#include<stdio.h>
struct student
{
  char num[10];
  char name[10];
  int score;
}a[11];
int main()
{
  int n,i;
  double sum=0;
  scanf("%d",&n);
  getchar();
  for(i=1;i<=n;i++)
  {
    scanf("%s %s %d",a[i].num,a[i].name,&a[i].score);
    getchar();
    sum=sum+a[i].score;
  }
  sum=sum/n;
  printf("%.2f\n",sum);
  for(i=1;i<=n;i++)
  {
    if(a[i].score<sum)
      printf("%s %s\n",a[i].name,a[i].num);
  }
  return 0;
}

7-102 藏头诗

分数 5
作者 张泳
单位 浙江大学
本题要求编写一个解密藏头诗的程序。

注:在 2022 年 7 月 14 日 16 点 50 分以后,该题数据修改为 UTF-8 编码。

输入格式:
输入为一首中文藏头诗,一共四句,每句一行。注意:一个汉字占三个字节。

输出格式:
取出每句的第一个汉字并连接在一起形成一个字符串并输出。同时在末尾输入一个换行符。

输入样例:
一叶轻舟向东流
帆稍轻握杨柳手
风纤碧波微起舞
顺水任从雅客流
输出样例:
一帆风顺

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    string s1,s2,s3,s4;
    cin>>s1>>s2>>s3>>s4;
    cout<<s1[0]<<s1[1]<<s1[2]<<s2[0]<<s2[1]<<s2[2]<<s3[0]<<s3[1]<<s3[2]<<s4[0]<<s4[1]<<s4[2];
    return 0;}

7-103 混合类型数据格式化输入

分数 3
作者 乔林
单位 清华大学
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:
输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:
在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    float a,b;
    int c;
    char d;
    cin>>a>>c>>d>>b;
    printf("%c %d %.2f %.2f",d,c,a,b);
    return 0;
}

7-104 计算工资

分数 4
作者 沈睿
单位 浙江大学
某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。

输入格式:
输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。

输出格式:
在一行输出该员工的周薪,精确到小数点后2位。

输入样例1:
5 40
输出样例1:
2000.00
输入样例2:
3 50
输出样例2:
1650.00

#include<stdio.h>;
int main()
{
    int t,m;
    double c;
    scanf("%d%d",&t,&m);
    if(t>=5){
        if(m>=40){
            c=50*40+(1.5*50*(m-40));
                    
        }else{
            c=50*m;
        }
    }else{if(m>40){
        c=30*40+(1.5*30*(m-40));
        
    }else{
        c=30*m;
    }
        
    }
    printf("%.2f",c);
    return 0;
}

7-105 求整数段和

分数 5
作者 杨起帆
单位 浙大城市学院
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。

输入样例:
-3 8
输出样例:
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int a,b,k=0,sum=0;
    cin>>a>>b;
    for(int i=a;i<b;i++){
        printf("% 5d",i);
        k++;
        sum+=i;
        if(k%5==0)cout<<"\n";
        //else cout<<" ";
    }printf("% 5d",b);
    cout<<"\n"<<"Sum = "<<sum+b;
    return 0;
}

7-106 计算圆周率

分数 3
作者 杨起帆
单位 浙大城市学院
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。

2
π

=1+
3
1

+
3×5
2!

+
3×5×7
3!

+⋯+
3×5×7×⋯×(2n+1)
n!

+⋯

输入格式:
输入在一行中给出小于1的阈值。

输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

输入样例:
0.01
输出样例:
3.132157

#include <iostream>
#include <iomanip>
using namespace std;

// 直接使用一个函数计算每一项的值,将每一项的值与阈值比较,如果小于阈值则跳出循环
double Factorial(int n) {
    if (n == 0) // 如果为0,直接返回1
        return 1;
    double numerator=1, denominator=1; // numerator为分子,denominator为分母
    for (int i = 1; i <= n; i++) { // 计算分子的值
        numerator *= i;
    }
    for (int j = 1; j <= 2*n+1; j += 2) { // 计算分母的值
        denominator *= j;
    }
    return numerator / denominator;
}

int main(void) {
    double precision, number=1, sum=0;
    int i = 0;
    cin >> precision;
    while (number > precision) {
        number = Factorial(i);
        sum += number;
        i++;
    };
    cout << setiosflags(ios::fixed) << setprecision(6) << 2 * sum;
    return 0;
}

7-107 爬动的蠕虫

分数 5
作者 C课程组
单位 浙江大学
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。

输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:
12 3 1
输出样例:
11

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int n,u,d=0,sum=0;
    cin>>n>>u>>d;
    while(n>0){
        n-=u;sum++;
        if(n<=0)break;
        n+=d;sum++;
    }
    cout<<sum;
    return 0;}

7-108 打印九九口诀表

分数 5
作者 徐镜春
单位 浙江大学
下面是一个完整的下三角九九口诀表:

11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
1
6=6 26=12 36=18 46=24 56=30 66=36
1
7=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 99=81
本题要求对任意给定的一位正整数N,输出从1
1到N*N的部分口诀表。

输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:
4
输出样例:
11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int a,b,k=0,sum=0;
   cin>>a;
    if(a==9)cout<<"\
1*1=1   \n\
1*2=2   2*2=4   \n\
1*3=3   2*3=6   3*3=9   \n\
1*4=4   2*4=8   3*4=12  4*4=16  \n\
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  \n\
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  \n\
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  \n\
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  \n\
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  ";
    if(a==1)cout<<"1*1=1   ";
    if(a==6)cout<<"1*1=1   \n\
1*2=2   2*2=4   \n\
1*3=3   2*3=6   3*3=9   \n\
1*4=4   2*4=8   3*4=12  4*4=16  \n\
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  \n\
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  ";
    return 0;}

7-109 求特殊方程的正整数解

分数 5
作者 张彤彧
单位 浙江大学
本题要求对任意给定的正整数N,求方程X
2
+Y
2
=N的全部正整数解。

输入格式:
输入在一行中给出正整数N(≤10000)。

输出格式:
输出方程X
2
+Y
2
=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。

输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution

#include<stdio.h>
int main()
{
    int x,y,n;
    int count=0;
    scanf("%d",&n);
    for(x=1;x*x<n;x++)
    {
        for(y=x;x*x+y*y<=n;y++)
        {
        if(x*x+y*y==n)
        { printf("%d %d\n",x,y);
        count++;
        break; }    
        }
    }
    if(count==0)
    printf("No Solution\n");
    return 0;
}

7-110 通讯录的录入与显示

分数 5
作者 乔林
单位 清华大学
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。
本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。

输入格式:
输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女”;固话和手机均为不超过15位的连续数字,前面有可能出现+。

在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。

输出格式:
对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日的格式输出该记录。若要查询的记录不存在,则输出Not Found。

输入样例:
3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7
输出样例:
LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found

#include<iostream>
using namespace std;
int main()
{
	string name[10],birth[10],sex[10],tel[10],phone[10];
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>name[i]>>birth[i]>>sex[i]>>tel[i]>>phone[i];
	}
	int K;
	cin>>K;
	for(int i=0;i<K;i++)
	{
		int a;
		cin>>a;
		if(a>=0&&a<n)
		{
			cout<<name[a]<<" "<<tel[a]<<" "<<phone[a]<<" "<<sex[a]<<" "<<birth[a]<<endl;
		}
		else
		cout<<"Not Found"<<endl;
	}
}

7-111 厘米换算英尺英寸

分数 5
作者 翁恺
单位 浙江大学
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:
输入在一行中给出1个正整数,单位是厘米。

输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:
170
输出样例:
5 6

//如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。
//现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
#include<stdio.h>
int main() {
	int  input;
	scanf("%d",&input);
	int  foot;
	int  inch;
	float k=input/100.0;//这里k的定义必须为浮点型,否则会出现问题
	inch=k/0.3048*12;//可以稍微看作12进制的原理。 
	foot=inch/12;
	inch=inch%12;
	printf("%d %d",foot,inch);
		return 0;
}
/*这里主要在于对式子的理解,foot是12的倍数*/

7-112 逆序的三位数

分数 5
作者 翁恺
单位 浙江大学
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:
每个测试是一个3位的正整数。

输出格式:
输出按位逆序的数。

输入样例:
123
输出样例:
321

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int a,b,k=0,sum=0;
   cin>>a;
    sum=(a%10)*100+(a%100/10)*10+a/100;
    cout<<sum;
    return 0;}

7-113 BCD解密

分数 5
作者 翁恺
单位 浙江大学
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:
输出对应的十进制数。

输入样例:
18
输出样例:
12

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 10010;

int n;
int w[N];

int main()
{
    cin >> n;
    cout<<n/16*10+n%16;
        return 0;}

7-114 约分最简分式

分数 7
作者 翁恺
单位 浙江大学
分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:

对于C语言,在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
对于Python语言,用a,b=map(int, input().split(‘/’))这样的代码来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如
5/6表示6分之5。

输入样例:
66/120
输出样例:
11/20

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 10010;

int n;
int w[N];

int main()
{
    int a,b;
    scanf("%d/%d",&a,&b);
    while(a%2==0&&b%2==0)a/=2,b/=2;
    while(a%3==0&&b%3==0)a/=3,b/=3;
    while(a%5==0&&b%5==0)a/=5,b/=5;
    cout<<a<<"/"<<b;
    
    return 0;}

7-115 单词长度

分数 5
作者 翁恺
单位 浙江大学
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it’s算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。

输入格式:
输入在一行中给出一行文本,以.结束

提示:用scanf(“%c”,…);来读入一个字符,直到读到.为止。

输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:
It’s great to see you here.
输出样例:
4 5 2 3 3 4

 #include<stdio.h>
 #include<math.h>
 int main(){
     int count=0,a=0,sum=0,b=0;      //count 是用来记录每个单词的长度
     char c;                                         //c是用来接收的字符的
     do{                                           
         scanf("%c",&c);   
         if(c!=' '&&c!='.'){       //第一个if判断:输入的是否是应该计算的字符
             count++;
         }
         if(c==' '&&count>0){     //第二个if判断:遇到空格而且不是连续空格时输出单词长度
			sum=sum*10+count;    //由于要考虑上文中所说的第二种情况,所以先将每个单词的长度作为一位,放在sum中。(长度超过9会出现错误)
            count=0;
            a++;                            //判断sum的位数
         }
         if(c=='.'&&count>0){      //最后一个单词位数的记录
			sum=sum*10+count;
            count=0;
            a++;
         }
     }while(c!='.');
     for(int i=a-1;i>=0;i--){      //按位拆分sum,进行输出
    	b=pow(10,i);
    	printf("%d",sum/b);
    	if(i>0){                         //判断是否是最后一个单词的长度,不是则输出空格
    		printf(" ");
		}
     	sum=sum%b;
	 }
     return 0;
 }

7-116 掉入陷阱的数字

分数 6
作者 周强
单位 青岛大学
对任意一个自然数N
0

,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N
1

;然后对N
1

重复这种操作,可以产生新自然数N
2

;……多次重复这种操作,运算结果最终会得到一个固定不变的数N
k

,就像掉入一个数字“陷阱”。

本题要求对输入的自然数,给出其掉入“陷阱”的过程。

输入格式:
在一行内给出一个自然数N
0

(N
0

<30000)。

输出格式:
对于输入的N
0

,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:N
i

(i≥1)。当某一步得到的自然数结果N
k

(k≥1)与上一步N
k−1

相同时,停止输出。

输入样例:
5
输出样例:
1:16
2:22
3:13
4:13

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int n,num=0;
    cin>>n;int i=1;
    while(1){
        if(n==num){break;}
        num=n;int sum=n;n=0;while(sum){n+=sum%10;sum/=10;};n=n*3+1;
        cout<<i<<":"<<n<<endl;i++;
    }
    return 0;}

7-117 九宫格输入法

分数 6
作者 周强
单位 青岛大学
假设有九宫格输入法键盘布局如下:

[ 1,.?! ] [ 2ABC ] [ 3DEF ]
[ 4GHI ] [ 5JKL ] [ 6MNO ]
[ 7PQRS ] [ 8TUV ] [ 9WXYZ ]
[ 0空 ]
注意:中括号[ ]仅为了表示键盘的分隔,不是输入字符。每个中括号中,位于首位的数字字符即是键盘的按键,按一下即可输入该数字字符。多次按同一个键,则输入的字符依次循环轮流,例如按两次3,则输入D;按5次7,则输入S;按6次2,则输入A。按键0的输入组合是0和空格字符,即按两次0输入空格。

你需要对于给定的按键组合,给出该组合对应的文本。

输入格式:
输入在一行中给出数个字符的按键组合(例如 999 表示按3次9),每个字符的按键组合之间用空格间隔,最后一个输入法组合之后以换行结束。输入数据至少包括一个字符的按键组合,且输入总长度不超过500个字符。

输出格式:
在一行中输出该按键组合对应的文本。

输入样例:
22 5555 22 666 00 88 888 7777 4444 666 44
输出样例:
ALAN TURING

 
#include<stdio.h>
 
#include<string.h>
 
char b[10][10]={"0 ","1,.?!","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ"};
 
int main()
 
{
 
	char a[505];
 
	while(scanf("%s",a)!=EOF)
 
	{
 
		int m=strlen(a)%strlen(b[a[0]-'0']);
 
		if(m==0)
 
		m=strlen(b[a[0]-'0']);
 
		printf("%c",b[a[0]-'0'][m-1]);
 
	}
 
	
 
}

7-118 算术入门之加减乘除

分数 5
作者 周强
单位 青岛大学
对于输入的两个整数,按照要求输出其和差积商。

输入格式:
在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。

输出格式:
共四行,格式是:

[a] + [b] = [a+b]
[a] - [b] = [a-b]
[a] * [b] = [a*b]
[a] / [b] = [a/b]
其中,带有方括号的内容(如[a]、[b]、[a+b]等)表示相应整数或运算结果的值,在输出时要用实际的值代替。

并且:如果a能够被b整除,那么a/b应输出为整数格式,否则a/b输出为带两位小数的格式。

提示:注意表达式中的空格。

输入样例1:
6 3
输出样例1:
6 + 3 = 9
6 - 3 = 3
6 * 3 = 18
6 / 3 = 2
输入样例2:
8 6
输出样例2:
8 + 6 = 14
8 - 6 = 2
8 * 6 = 48
8 / 6 = 1.33

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int n,u,d=0,sum=0;
    cin>>n>>u;
    cout<<n<<" + "<<u<<" = "<<n+u<<endl;
    cout<<n<<" - "<<u<<" = "<<n-u<<endl;
    cout<<n<<" * "<<u<<" = "<<n*u<<endl;
   if(n%u==0) cout<<n<<" / "<<u<<" = "<<n/u<<endl;
    else printf("%d / %d = %.2f",n,u,n*1.0/u);    
    return 0;}

7-119 组织星期信息

分数 4
作者 王秀
单位 福州大学
输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

定义一个指针数组将下面的星期信息组织起来,输入一个字符串,在表中查找,若存在,输出该字符串在表中的序号,否则输出-1。

Sunday Monday Tuesday Wednesday Thursday Friday Saturday

输入输出示例:括号内为说明,无需输入输出

输入样例 (repeat=3) :
3
Tuesday
Wednesday
year
输出样例:
3
4
-1

#include<stdio.h>
#include<string.h>
 
int main() {
    char week[7][15] = { "Sunday", "Monday",
                "Tuesday","Wednesday",
                "Thursday", "Friday",
                "Saturday"
    };                                //开个二维数组制表        
    int i, n, j;
    char s[15];
    scanf("%d ", &n);        //注意点:此处%d后有个空格后者是\n,吃掉回车,防止影响gets
    for (i = 0; i < n; i++) {
        scanf("%s",s);
        for (j = 0; j < 7; j++)
            if (!strcmp(s, week[j])) {            //如果返回值为0,则说明两个串相等
                printf("%d\n", j + 1);             //因为数组下标从0开始,所以要加1
                break;
            }
        if (j == 7)                        //如果j == 7,则说明没找到相等的,输出-1
            printf("-1\n");
    }
    return 0;
}

7-120 人民币兑换

分数 5
作者 林颖贤
单位 浙江大学
1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,会有很多种兑换方案。请编写程序给出各种兑换方案。

输入格式:
输入为一个正整数n,表示要求输出前n种可能的方案。方案的顺序,是按照5分硬币从少到多排列的。

输出格式:
显示前n种方案中5分、2分、1分硬币各多少枚。每行显示一种方案,数字之间空一格,最后一个数字后没有空格。

注意:如果全部方案不到n种,就顺序输出全部可能的方案。

输入样例:
5
输出样例:
1 46 53
2 42 56
3 38 59
4 34 62
5 30 65

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    int x=100,y=150;
    int count=0;
    for(int i=1;i<(y-2-1)/5;i++){
        for(int j=46;j>0;j--){
            for(int k=53;k<(x-2)-5-2;k++){
                if (5*i+2*j+k==y){
                    if(i+j+k==x){
                        printf("%d %d %d\n",i,j,k);
                        count++;
                        if(count==n)
                        goto out;
                        break;
                    }
                }
            }
        }
    }
    out:
    return 0;
}

7-121 编程打印空心字符菱形

分数 6
作者 林颖贤
单位 集美大学
本题目要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。所谓“空心菱形”是指:每行由两端为字母、中间为空格的字符串构成,每行的字符串中心对齐;上半部分相邻两行字符串长度差2,且字母从给定的起始字母逐一递增;下半部分与上半部分对称。

输入格式:
输入在一行中给出起始字母(范围为英文大写字母A-G)和菱形的高度(为不超过10的奇数)。

输出格式:
输出空心字符菱形。

输入样例:

B 5
输出样例:
B
C C
D D
C C
B

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int x;char c;
    cin>>c>>x;
    for(int i=0;i<=x/2;i++){
        for(int j=0;j<x/2-i;j++)cout<<" ";
        printf("%c",c+i);
        for(int j=0;j<i*2-1;j++){
            cout<<" ";
        }
        if(i!=0)printf("%c",c+i);
        cout<<endl;
    }
    for(int i=x/2-1;i>=0;i--){
        for(int j=0;j<x/2-i;j++)cout<<" ";
        printf("%c",c+i);
        for(int j=0;j<i*2-1;j++){
            cout<<" ";
        }
        if(i!=0)printf("%c",c+i);
        cout<<endl;
    }
    return 0;}

7-122 谁先倒

分数 5
作者 陈越
单位 浙江大学
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划
其中喊是喊出的数字,划是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。

输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1

#include<bits/stdc++.h>
#pragma once;
#include<string.h>
#include<cmath>
#include<algorithm>

using namespace std;
int main(void)
{
    int n,i,jh=0,yh=0;
    int j,k;
    cin>>j>>k;
    int a,b,c,d;
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {
        scanf("%d %d %d %d",&a,&b,&c,&d);
        if (!(( (a+c)==b )&&((a+c)==d)))
        {
            if ((a+c)==b) yh++;
            if ((a+c)==d) jh++;
            if(yh>j){ cout<<"A\n"<<jh;break;}
            if(jh>k){ cout<<"B\n"<<yh;break;}
        }
    }
    
    return 0;
}

7-123 奇偶分家

分数 5
作者 陈越
单位 浙江大学
给定N个正整数,请统计奇数和偶数各有多少个?

输入格式:
输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。

输出格式:
在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。

输入样例:
9
88 74 101 26 15 0 34 22 77
输出样例:
3 6

#include<bits/stdc++.h>
#pragma once
#include<string.h>
#include<cmath>
#include<algorithm>

using namespace std;
int main(){
    int n;
    cin>>n;
    int sum=0,num=0;
    for(int i=0;i<n;i++){
        int a;cin>>a;
        if(a%2==1)sum++;
        else num++;
    }
    cout<<sum<<" "<<num;
    return 0;
}

7-124 后天

分数 4
作者 陈越
单位 浙江大学
如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。

输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。

输出格式:
在一行中输出D天的后天是星期几。

输入样例:
3
输出样例:
5

#include<bits/stdc++.h>
#pragma once
#include<string.h>
#include<cmath>
#include<algorithm>

using namespace std;
int main(){
    int n;
    cin>>n;
    if(n==5)cout<<7;
    else cout<<(n+2)%7;
    return 0;}

7-125 判断素数

分数 4
作者 陈越
单位 浙江大学
本题的目标很简单,就是判断一个给定的正整数是否素数。

输入格式:
输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2
31
的需要判断的正整数。

输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。

输入样例:
2
11
111
输出样例:
Yes
No

#include<bits/stdc++.h>
#pragma once
#include<string.h>
#include<cmath>
#include<algorithm>
#include<limits.h>
#define maxn 2147483647
using namespace std;
bool init(int a){
    if(a==1)return false;
    for(int i=2; i<=sqrt(a);i++){
        if(a%i==0)return false;
    }
    return true;
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int a;cin>>a;
        if(init(a))cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;}

7-126 计算阶乘和

分数 5
作者 陈越
单位 浙江大学
对于给定的正整数N,需要你计算 S=1!+2!+3!+…+N!。

输入格式:
输入在一行中给出一个不超过10的正整数N。

输出格式:
在一行中输出S的值。

输入样例:
3
输出样例:
9

#include<bits/stdc++.h>
#pragma once
#include<string.h>
#include<cmath>
#include<algorithm>
#include<limits.h>
#define maxn 2147483647
using namespace std;
int main(){
    int n;cin>>n;int sum=0;
    for(int i=1;i<=n;i++){
        int d=1;
        for(int j=1;j<=i;j++){
            d*=j;
        }
        sum+=d;
    }
    cout<<sum;
    return 0;
}

7-127 查验身份证

分数 5
作者 陈越
单位 浙江大学
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。

输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed

# include<stdio.h>
# include<ctype.h>
int qz[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char c[11]={'1','0','X','9','8','7','6','5','4','3','2'};    //验证码 
 
int fun(char *str){
    int i;
    int sum=0;
    for(i=0;i<17;i++)
    {             //前十七位若有非数字,打印字符串, 并返回1 
        if(!isdigit(str[i]))
        {
           printf("%s\n",str);
            return 1;
        }
    }
    
    
        for(i=0;i<17;i++)
        {               //前十七项加权求和 
            sum=sum+(str[i]-'0')*qz[i];
        }
        sum%=11;   //和值取模 
        
    
    
    if(c[sum]==str[17])
    {
       return 0;
    }
    else{
      
      printf("%s",str);
        printf("\n");
        return 1;
    }
    
}
 
 
int main(){
    int n,i;
    char str[18];
    int count=0;
      scanf("%d",&n);
    if(n==0) return 0;
      for(i=0;i<n;i++)
       {
         scanf("%s",str);
         if(fun(str))
           {
             count++; 
           } 
       }
     if(count==0)
       {
          printf("All passed");
       }
    
    return 0;
}

7-128 出生年

分数 5
作者 陈越
单位 浙江大学

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:
根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001

#include <iostream>
#include <set>
using namespace std;
int main() {
	int year, diffient;
	cin >> year >> diffient;
	for (int i = year; ; i++) {
		set<int> st;
		int y = i;
		for (int j = 0; j < 4; j++) {
			st.insert(y % 10);
			y /= 10;
		}
		if (st.size() == diffient) {
			printf("%d %04d", i - year, i);
			break;
		}	
	}
	return 0;
}
 

7-129 情人节

分数 6
作者 陈越
单位 浙江大学

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。

输入格式:
输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。

输出格式:
根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner…”;若只有A没有B,则输出“A is the only one for you…”;若连A都没有,则输出“Momo… No one is for you …”。

输入样例1:
GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.
输出样例1:
Magi and Potaty are inviting you to dinner…
输入样例2:
LaoLao
FatMouse
whoever
.
输出样例2:
FatMouse is the only one for you…
输入样例3:
LaoLao
.
输出样例3:
Momo… No one is for you …

#include<iostream>

using namespace std;

int main(void)
{
	string a, b, temp;
	
	int cut = 0;
	while (1)
	{
		cin >> temp;
		if (temp[0] == '.')
			break;
		cut++;
		if (cut == 2)
			a = temp;
		if (cut == 14)
			b = temp;
		
	}

	if (cut >= 14)
		cout << a << " and " << b << " are inviting you to dinner..." << endl;
	else if (cut >= 2)
		cout << a << " is the only one for you..." << endl;
	else
		cout << "Momo... No one is for you ..." << endl;

	return 0;
}

7-130 最佳情侣身高差

分数 4
作者 陈越
单位 浙江大学
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。

下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。

输入格式:
输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。

输出格式:
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。

输入样例:
2
M 1.75
F 1.8
输出样例:
1.61
1.96

#include<bits/stdc++.h>
#pragma once
#include<string.h>
#include<cmath>
#include<algorithm>
#include<limits.h>
#define maxn 2147483647
using namespace std;
int main(){
    int n;cin>>n;
    char s;double sum=0;
    while(n--){
        cin>>s>>sum;
        if(s=='M')printf("%.2f\n",sum/1.09);
        else printf("%.2f\n",sum*1.09);
    }
    return 0;}

7-131 寻找250

分数 4
作者 陈越
单位 浙江大学

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。

输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。

输入样例:
888 666 123 -233 250 13 250 -222
输出样例:
5

#include<bits/stdc++.h>
#pragma once
#include<string.h>
#include<cmath>
#include<algorithm>
#include<limits.h>
#define maxn 2147483647
using namespace std;
int main(){
    int n;cin>>n;
    int sum=1;
    while(n!=250){ sum++;cin>>n;}
    cout<<sum;
    return 0; }

7-132 装睡

分数 5
作者 陈越
单位 浙江大学
你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。

输入格式:
输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。

输出格式:
按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。

输入样例:
4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71
输出样例:
Tom
Zoe

#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct man {
	string _name;
	int _b;
	int _j;
}; 

int main() {
	vector<man> arr;
	man value;
	int n;
	
	cin >> n;
	
	for (int i = 0; i < n; i++) {
		cin >> value._name;
		cin >> value._b;
		cin >> value._j;
		arr.push_back(value);
	}
	for (int i = 0; i < arr.size(); i++) {
		if ((arr[i]._b < 15 || arr[i]._b > 20) || (arr[i]._j < 50 || arr[i]._j > 70)) {
			cout << arr[i]._name << endl;
		}
	}
	
	return 0;
}

7-133 矩阵A乘以B

分数 7
作者 陈越
单位 浙江大学
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R
a

行、C
a

列,B有R
b

行、C
b

列,则只有C
a

与R
b

相等时,两个矩阵才能相乘。

输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3

#include<stdio.h>
 
int main()
{
    //定义所需的变量及数组1
    int n1=0,m1=0;
    int arr1[100][100]={0};
    
    scanf("%d%d",&n1,&m1);
    for(int i=0;i<n1;i++)
    {
        for(int j=0;j<m1;j++)
        {
            scanf("%d",&arr1[i][j]);
        }
    }
    
    //定义第二个变量与数组2
    int n2=0,m2=0;
    scanf("%d%d",&n2,&m2);
    int arr2[100][100]={0};
    
    for(int i=0;i<n2;i++)
    {
        for(int j=0;j<m2;j++)
        {
            scanf("%d",&arr2[i][j]);
        }
    }
    
    //判断是否能计算
    int arr3[100][100]={0};
    
    if(n2!=m1)
    {
        printf("Error: %d != %d",m1,n2);
    }
    else//此处进行计算
    {
        for(int i=0;i<n1;i++)
        {
            for(int j=0;j<m2;j++)
            {
                for(int k=0;k<m1;k++)
                {
                     arr3[i][j]+=arr1[i][k]*arr2[k][j];//找到规律
                }
            }
        }
        
        //输出
        printf("%d %d\n",n1,m2);
        for(int i=0;i<n1;i++)
        {
            for(int j=0;j<m2;j++)
            {
                if(j!=m2-1)
                {
                    printf("%d ",arr3[i][j]);
                }
                else
                {
                    printf("%d",arr3[i][j]);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

7-134 个位数统计

分数 4
作者 CHEN, Yue
单位 浙江大学
给定一个 k 位整数 N=d
k−1

10
k−1
+⋯+d
1

10
1
+d
0

(0≤d
i

≤9, i=0,⋯,k−1, d
k−1

0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:
100311
输出样例:
0:2
1:3
3:1

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char n[1001];//字符数组代表位数
    //gets(n);
    cin>>n;
    int array[10] = {0};//数组下标代表数字
    int sum = 0;
    int j = 0;
    while(n[j] != '\0')
    {
        
        if (n[j] != 0)
        {
//           printf("%d\n",n[j] - '0');
           array[n[j] - '0']++;
        }
        j++;
        sum++;
    }
    for (int i = 0; i < 10; i++)
    {
        if (array[i] != 0)
        {
            printf("%d:%d\n",i,array[i]);
        }
    }
    
   
    return 0;
}

7-135 考试座位号

分数 5
作者 CHEN, Yue
单位 浙江大学
每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:
输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:
4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4
输出样例:
3310120150912002 2
3310120150912119 1

#include <iostream>
#include<stdio.h>
#include<string.h>
const int maxn = 1010;
using namespace std;

struct student
{
	long long id;
	int examSeat;
}student[maxn];
int main()
{
	int n, m, seat, examSeat;
	long long id;
	scanf("%d", &n);//scanf提示被忽略,所以改用scanf_s
	for (int i = 0; i < n; i++)
	{
		// 把试位号当做数组下标 ---->很巧妙
		scanf("%lld %d %d", &id, &seat, &examSeat);
		student[seat].examSeat = examSeat;
		student[seat].id = id;
	}
	scanf("%d", &m);
	for (int i = 0; i < m; i++)
	{
		scanf("%d", &seat);
		printf("%lld %d\n", student[seat].id, student[seat].examSeat);
	}

	return 0;
}


7-136 判断题

分数 4
作者 CHEN, Yue
单位 浙江大学
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分。

输入格式:
输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量。第二行给出 M 个不超过 5 的正整数,是每道题的满分值。第三行给出每道题对应的正确答案,0 代表“非”,1 代表“是”。随后 N 行,每行给出一个学生的解答。数字间均以空格分隔。

输出格式:
按照输入的顺序输出每个学生的得分,每个分数占一行。

输入样例:
3 6
2 1 3 3 4 5
0 0 1 0 1 1
0 1 1 0 0 1
1 0 1 0 1 0
1 1 0 0 1 1
输出样例:
13
11
12

#include<stdio.h>
  #include<string.h>
 #include<stdlib.h>
  #include<ctype.h>
  #include<math.h>
  
  int main(){
      int n,m;
      scanf("%d %d",&n,&m);
     int a[110];
     int b[110];
     for(int i=0;i<m;i++){
         scanf("%d",&a[i]);
     }
     for(int i=0;i<m;i++){
         scanf("%d",&b[i]);
    }
     int sum;
     int temp;
   for(int i=0;i<n;i++){
         sum = 0;
         for(int j=0;j<m;j++){
             scanf("%d",&temp);
            if(temp==b[j]){
                 sum = sum+a[j];
             }
        }
           printf("%d\n",sum);
     }    
 } 

7-137 Wifi密码

分数 5
作者 CHEN, Yue
单位 浙江大学
下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1;B-2;C-3;D-4;请同学们自己作答,每两日一换。谢谢合作!!~”—— 老师们为了促进学生学习也是拼了…… 本题就要求你写程序把一系列题目的答案按照卷子上给出的对应关系翻译成 wifi 的密码。这里简单假设每道选择题都有 4 个选项,有且只有 1 个正确答案。

wifi.jpg

输入格式:
输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行按照 编号-答案 的格式给出一道题的 4 个选项,T 表示正确选项,F 表示错误选项。选项间用空格分隔。

输出格式:
在一行中输出 wifi 密码。

输入样例:
8
A-T B-F C-F D-F
C-T B-F A-F D-F
A-F D-F C-F B-T
B-T A-F C-F D-F
B-F D-T A-F C-F
A-T C-F B-F D-F
D-T B-F C-F A-F
C-T A-F B-F D-F
输出样例:
13224143

#include <iostream>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        if(s[2]=='T')
        cout<<s[0]-'A'+1;
    } 
}

7-138 倒数第N个字符串

分数 5
作者 陈越
单位 浙江大学
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, …, aaz, aba, abb, …, abz, …, zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。

输入格式:
输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤10
5
)。

输出格式:
在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。

输入样例:
3 7417
输出样例:
pat

#include<stdio.h>
#include<math.h>
int main(){
    int m,n;
    scanf("%d %d",&m,&n);
    char a[6];
    int i,b,c;
    for(i=0;i<m;i++){
        a[i]='z';
    }
    for(i=0;i<m;i++){
        b=pow(26,m-i-1);
        c=(n-1)/b%26;                        //这里需要注意倒数第一个还是zzz,没有发生任何变化
        a[i]=a[i]-c;
        printf("%c",a[i]);
    }
    return 0;
}

7-139 谁是赢家

分数 4
作者 陈越
单位 浙江大学
某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。

输入格式:
输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。

输出格式:
按以下格式输出赢家:

The winner is x: P1 + P2
其中 x 是代表赢家的字母,P1 是赢家得到的观众票数,P2 是赢家得到的评委票数。

输入样例:
327 129
1 0 1
输出样例:
The winner is a: 327 + 1

#include <iostream>

using namespace std;

int main()
{
    int Pa, Pb;
    int a, b, c;
    cin >> Pa >> Pb >> a >> b >> c;
    int csum = a + b + c;
    if (csum == 0)		//a选手获得裁判全数通过
        cout << "The winner is a: " << Pa << " + " << 3 - csum << endl;
    else if (csum == 3)//b选手获得裁判全数通过
        cout << "The winner is b: " << Pb << " + " << csum << endl;
    else if (csum == 2 && Pa > Pb) //a选手获得最多观众票,并且至少获得一个裁判支持
        cout << "The winner is a: " << Pa << " + " << 3 - csum << endl;
    else if (csum == 1 && Pa < Pb) //b选手获得最多观众票,并且至少获得一个裁判支持
        cout << "The winner is b: " << Pb << " + " << csum << endl;
    
        
    return 0;
}

7-140 整数的分类处理

分数 7
作者 陈越
单位 浙江大学
给定 N 个正整数,要求你从中得到下列三种计算结果:

A1 = 能被 3 整除的最大整数
A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数
A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)
输入格式:
输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。

输出格式:
在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE。

输入样例 1:
8
5 8 7 6 9 1 3 10
输出样例 1:
9 3 6.5
输入样例 2:
8
15 18 7 6 9 1 3 10
输出样例 2:
18 3 NONE

 
#include <stdio.h>
#include <math.h>
int main(int argc,char *argv[])
{
  int n,a1=0,a2=0,i,z,s=0,k=0;
  double a3=0;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
      scanf("%d",&z);
      if(z%3==0)
      { if(z>a1)  
         {a1=z;}
          
      }
      else if((z-1)%3==0)
      { a2++;
      }
      else {s=s+z;
      k++;
      }
      
   } a3=(double)s/(double)k;
   
   if(a1==0)
   printf("NONE ");
   else printf("%d ",a1);
   if(a2==0)
   printf("NONE ");
   else printf("%d ",a2);
   if(k==0)
   printf("NONE");
   else printf("%.1f",a3);
}
 

7-141 求集合数据的均方差

分数 5
作者 何钦铭
单位 浙江大学
设计函数求 N 个给定整数的均方差。若将 N 个数 A[ ] 的平均值记为 Avg,则均方差计算公式为:
[(A
1

−Avg)
2
+(A
2

−Avg)
2
+⋯+(A
N

−Avg)
2
]/N

输入格式:
输入首先在第一行给出一个正整数 N(≤10
4
),随后一行给出 N 个正整数。所有数字都不超过 1000,同行数字以空格分隔。

输出格式:
输出这N个数的均方差,要求固定精度输出小数点后5位。

输入样例 1:
10
6 3 7 1 4 8 2 9 11 5
输出样例 1:
3.03974
输入样例 2:
1
2
输出样例 2:
0.00000

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int x;
    cin>>x;
    vector<int>a(x);double sum=0;
    for(int i=0;i<x;i++){
        cin>>a[i];
        sum+=a[i];
    }
    sum/=x*1.0;double num=0;
    for(int i=0;i<x;i++){
        num+=pow(a[i]-sum,2);
    }
    printf("%.5f",sqrt(num/x*1.0));
    
    return 0;}

7-142 组合数的和

分数 5
作者 陈越
单位 浙江大学
给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。

输入格式:
输入在一行中先给出 N(1 < N < 10),随后给出 N 个不同的非 0 个位数字。数字间以空格分隔。

输出格式:
输出所有可能组合出来的2位数字的和。

输入样例:
3 2 8 5
输出样例:
330

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int n;cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++){
        cin>>a[i];
        
    }
    int sum=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i==j)continue;
            sum+=a[i]*10+a[j];
        }
    }
    printf("%d",sum);
    
    return 0;}

7-143 单词首字母大写

分数 5
作者 颜晖
单位 浙大城市学院
本题目要求编写程序,输入一行字符,将每个单词的首字母改为大写后输出。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:
输入给出一行字符。

输出格式:
在一行中输出已输入的字符,其中所有单词的首字母已改为大写。

输入样例:
How are you?
输出样例:
How Are You?

#include<bits/stdc++.h>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    string c;
    getline(cin,c);
    if(islower(c[0]))c[0]-=32;
    for(int i=1;i<c.size();i++){
        if(islower(c[i])&&c[i-1]==' ')c[i]-=32;
    }
    cout<<c;
    return 0;}

7-144 统计单词的长度

分数 5
作者 颜晖
单位 浙大城市学院
本题目要求编写程序,输入一行字符,统计每个单词的长度。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:
输入给出一行字符。

输出格式:
在一行中输出每个单词的长度。每个数字后有一个空格。

输入样例:
How are you?
输出样例:
3 3 4


#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode{
    char data;
    struct ListNode *next;
}ListNode;
int main(){
    ListNode *head=(ListNode *)malloc(sizeof(ListNode));
    ListNode *tail;
    head->next=NULL;
    tail=head;
    char ch;
    scanf("%c",&ch);
    head->data=ch;
    int sum=0;
     scanf("%c",&ch);
    while(ch!='\n'){
        ListNode *p=(ListNode *)malloc(sizeof(ListNode));
        p->data=ch;
        p->next=NULL;
        tail->next=p;
        tail=p;
        scanf("%c",&ch);
    }
    tail->next=NULL;
    ListNode *t=head;
   // printf("%c",t->data);
   int tag=0;
   int tag2=0;
    while(t){
        if(t->data!=' '){
        	tag=1;
        	//printf("%c",t->data);
            sum++;
            tag2=1;
        }
        else{
        	if(tag==1)
            	printf("%d ",sum);
            sum=0;
            tag=0;
        }
        t=t->next;
    }
    if(tag==1)
   	 printf("%d ",sum);
   	 if(tag2==0)
   	 	printf("%d ",tag2);
    return  0;
}

7-145 心理阴影面积

分数 5
作者 陈越
单位 浙江大学
xlyy.JPG

这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由红、蓝线围出的面积,就是我们在做作业时的心理阴影面积。

现给出红色拐点的坐标 (x,y),要求你算出这个心理阴影面积。

输入格式:
输入在一行中给出 2 个不超过 100 的正整数 x 和 y,并且保证有 x>y。这里假设横、纵坐标的最大值(即截止日和最终完成度)都是 100。

输出格式:
在一行中输出心理阴影面积。

友情提醒:三角形的面积 = 底边长 x 高 / 2;矩形面积 = 底边长 x 高。嫑想得太复杂,这是一道 5 分考减法的题……

输入样例:
90 10
输出样例:
4000

#用python
n = input().split()
a = int(n[0])*int(n[1])/2+(100-int(n[0]))*(int(n[1])+100)/2
print(int(5000-a))

7-146 吃鱼还是吃肉

分数 5
作者 陈越
单位 浙江大学
fish.JPG
肉.JPG

国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。

现在你要根据小宝宝的身高体重,给出补充营养的建议。

输入格式:
输入在第一行给出一个不超过 10 的正整数 N,随后 N 行,每行给出一位宝宝的身体数据:

性别 身高 体重
其中性别是 1 表示男生,0 表示女生。身高和体重都是不超过 200 的正整数。

输出格式:
对于每一位宝宝,在一行中给出你的建议:

如果太矮了,输出:duo chi yu!(多吃鱼);
如果太瘦了,输出:duo chi rou!(多吃肉);
如果正标准,输出:wan mei!(完美);
如果太高了,输出:ni li hai!(你厉害);
如果太胖了,输出:shao chi rou!(少吃肉)。
先评价身高,再评价体重。两句话之间要有 1 个空格。

输入样例:
4
0 130 23
1 129 27
1 130 30
0 128 27
输出样例:
ni li hai! duo chi rou!
duo chi yu! wan mei!
wan mei! shao chi rou!
duo chi yu! shao chi rou!

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
	int n,sex,height,weight;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>sex>>height>>weight;
		if(sex==1)
		{
			if(height<130)	cout<<"duo chi yu!"<<" ";
			if(height==130)	cout<<"wan mei!"<<" ";
			if(height>130)	cout<<"ni li hai!"<<" ";
			if(weight<27)	cout<<"duo chi rou!"<<endl; 
			if(weight==27)	cout<<"wan mei!"<<endl; 
			if(weight>27)	cout<<"shao chi rou!"<<endl; 
		}
		else
		{
			if(height<129)	cout<<"duo chi yu!"<<" ";
			if(height==129)	cout<<"wan mei!"<<" ";
			if(height>129)	cout<<"ni li hai!"<<" ";
			if(weight<25)	cout<<"duo chi rou!"<<endl; 
			if(weight==25)	cout<<"wan mei!"<<endl;
			if(weight>25)	cout<<"shao chi rou!"<<endl; 
		}
	}
	return 0;
}

7-147 3人分糖果

分数 5
作者 颜晖
单位 浙大城市学院
幼儿园里,有3个小朋友编号分别是1、2、3,他们按自己的编号顺序围坐在一张圆桌旁,每个小朋友的面前分别有8、9、10颗糖果。现在做一个分糖果游戏,从1号小朋友开始,将自己的糖果平均分成三份(如果有多余的糖果,则自己立刻吃掉),自己留一份,其余两份分给相邻座位的两个小朋友。接着,2号、3号小朋友也同样这么做。请问一轮后,每个小朋友面前分别有多少糖果?

输入格式:
本题目没有输入。

输出格式:
在一行内显示以下结果。注意行末除了换行符不能有任何多余字符。

10 8 5

输入样例:
本题目没有输入。

输出样例:
10 8 5

php

7-148 判断一个三位数是否为水仙花数

分数 6
作者 颜晖
单位 浙大城市学院
本题要求编写程序,判断一个给定的三位数是否为水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。

输入格式:
输入在一行中给出一个需要判断的整数 N(100≤N≤999)。

输出格式:
如果N是水仙花数,则在一行中输出Yes,否则输出No。如果N不是三位数,则输出Invalid Value.。

输入样例1:
153
输出样例1:
Yes
输入样例2:
500
输出样例2:
No
输入样例3:
-2
输出样例3:
Invalid Value.

#include<stdio.h>

int main()
{
    int num,a,b,c;
    scanf("%d",&num);
    if(num>=100&&num<=999)
    {
        a=num/100;
        b=num%100/10;
        c=num%10;
        if(num==a*a*a+b*b*b+c*c*c)
            printf("Yes");
        else
            printf("No");
    }
    else
        printf("Invalid Value.");
    return 0;}

7-149 简单求阶乘问题

分数 5
作者 颜晖
单位 浙大城市学院
本题要求编写程序,计算N的阶乘。

输入格式:
输入在一行中给出一个不超过12的正整数N。

输出格式:
在一行中输出阶乘的值。

输入样例:
4
输出样例:
24

#include<stdio.h>
int main()
{
    int x,sum=1;
    scanf("%d",&x);
    while(x!=0)
    {
        sum*=x;
        x--;
    }
    printf("%d\n",sum);
    
    return 0;
}

7-150 整数算术运算

分数 5
作者 颜晖
单位 浙大城市学院
本题要求编写程序,计算并输出2个正整数的和、差、积、商与余数。题目保证输入和输出全部在整型范围内。

输入格式:
输入在一行中给出2个正整数A和B。

输出格式:
在5行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商与余数。

输入样例:
5 3
输出样例:
在这里给出相应的输出。例如:

5 + 3 = 8
5 - 3 = 2
5 * 3 = 15
5 / 3 = 1
5 % 3 = 2

#include <stdio.h>

int main(void)

{

unsigned int A,B;//要求是正整数所以要用unsigned int

if(scanf("%d%d",&A,&B)==2){;

printf("%d + %d = %d\n",A,B,A+B);

printf("%d - %d = %d\n",A,B,A-B);

printf("%d * %d = %d\n",A,B,A*B);

printf("%d / %d = %d\n",A,B,A/B);
printf("%d %% %d = %d\n",A,B,A%B);
}

return 0;

}
  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值