PTA(02)典例详解(6-10)

目录

7-6 N个数求和

7-7 谁是赢家

 7-8 整数的分类处理

 7-9 与01典例相似,已解,见《01详解》

7-10 不变初心数

7-6 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

 题目不难,但需要注意的点有很多导致常常过不了监测点拿到满分,首先要注意题目需要保证所有分子和分母都在长整型范围内。另外,复数的符号要在分子前面。易错点是输出的时候也是长整型变量,其实应该是整型

解题思路:将分子分母分别存入两个数组,通分相加,考虑分子=<0的情况,记得求分子分母的最大公约数将这个分数月份,在输出的时候也考虑三种情况,1.分子小于分母,则正常输出这个分数2.分子等于分母,之间输出相除后的整数3.分子大于分母,此时就要满足题中的条件,先相除输出整数部分,再输出其小数部分,代码如下

#include <stdio.h>
int main()
{
    long a[102],b[102];
    int x=0,x1,y=1;
    int n,i,j,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%ld/%ld",&a[i],&b[i]);
    }
    for(i=1;i<=n;i++){
        x1 = a[i];
        for(j=1;j<=n;j++){
            if(j!=i)
            x1 *= b[j];
        }
        x += x1;
        y *= b[i];
    }//通分
    if(x==0){
        printf("0");
        return 0;
    }
    if(x<0){
        printf("-");
        x = -x;
    }
    i = x,j = y;
    while(j){
        t = i%j;
        i = j;
        j = t;
    }//求最大公约数
    x /= i;
    y /= i;//约分 
    if(x<y) printf("%d/%d\n",x,y);
    else
        if(x==y) printf("%d\n",x/y);
        else{
            printf("%d",x/y);//先输出整数部分
            if(x%y){
                printf(" %d/%d\n",x%y,y);//如果没有倍数关系就输出分数部分
            }
        }
    return 0;
}

7-7 谁是赢家

某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 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

解题思路:这里if的两个分支就是a和b谁的观众票数更多,同时在满足观众票数最多的条件时还必须满足必须有一票评委票,我们可以用count记评委票数,那么a所得的评委票数就是3-count ,count!=3也就是至少有一票评委票是a的,代码如下

# include<stdio.h>
int main()
{
	int pa,pb,p1,p2,p3,count;
	scanf("%d %d\n",&pa,&pb);
	scanf("%d %d %d",&p1,&p2,&p3);
	count=p1+p2+p3;
	if(pa>pb&&count!=3)
	{
		printf("The winner is a: %d + %d",pa,3-count);
	}
	else
	{
		printf("The winner is b: %d + %d",pb,count);
	}
	return 0;
}

 7-8 整数的分类处理

给定 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

 题目简单但是却有很多坑,A1是要一个最大整数,A2是要记录所有整数的个数,A3则是要求平均值

解题思路:对于A1,使其不断与前一个数进行比较并赋值从而得到最后输出的最大整数,对于A2,只要满足条件就对A2累加一次,得到所有的个数,对于A3,在进行累加求和的同时也要进行计数,从而在输出的时候得出平均数

#include <stdio.h>
int main() {
	int n,m,a1=0,a2=0,a3=0,sum=0;
	scanf("%d", &n);
	for(int i=1;i<=n;i++){
		scanf("%d", &m);
		if (m % 3 == 0 && m > a1)a1 = m;
		if ((m - 1) % 3 == 0)a2++;
		if ((m - 2) % 3 == 0){
			a3++;
			sum += m;
		}
	}
	if (a1 == 0)printf("NONE ");
	else printf("%d ", a1);
	if (a2 == 0)printf("NONE ");
	else printf("%d ", a2);
	if (a3 == 0)printf("NONE");
	else printf("%.1f", sum*1.00/a3);
}

7-9 与01典例相似,已解,见《01详解》

7-10 不变初心数

不变初心数是指这样一种特别的数,它分别乘 2、3、4、5、6、7、8、9 时,所得乘积各位数之和却不变。例如 18 就是这样的数:18 的 2 倍是 36,3+6=9;18 的 3 倍是 54,5+4=9;…… 18 的 9 倍是 162,1+6+2=9。对于 18 而言,9 就是它的初心。本题要求你判断任一个给定的数是否有不变的初心。

输入格式:

输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一个不超过 105 的正整数。

输出格式:

对每个给定的数字,如果它有不变的初心,就在一行中输出它的初心;否则输出 NO

输入样例:

4
18
256
99792
88672

输出样例:

9
NO
36
NO

 解题思路:对输入的这个数分别乘2 3 4 5 6 7 8 9并将所得乘积分解取得每一位进行相加,将所求得和以下标形式存入数组,最后只需判断以sum为下标的值是否为8,如果是说明和全部相等,符合题意,如果小于8则说明不是,则输出NO

#include<stdio.h>
int main()
{
	int n,m,i,j,temp,sum=0,a,b[100001],k;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&m);
		for(j=2;j<10;j++)
		{
			sum=0;
			temp=m*j;              
			while(temp!=0)         
			{
				a=temp%10;         
				temp=temp/10;         
				sum=sum+a;          
			}
			b[sum]++;                 
		}
		if(b[sum]==8)             
			printf("%d\n",sum);
		else
			printf("NO\n");
		for(j=0;j<100001;j++)      
			b[j]=0;
	}
	return 0;	
}

需要注意的是最后要把数组b全部重置为0才能进行下一次,否则即使结果是对的也不能通过检测点

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nuc-不晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值