目录
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才能进行下一次,否则即使结果是对的也不能通过检测点