郑轻 21 ACM可好玩了(3) 部分题解 以及总结

1.  问题 C: 等腰三角形(主要坑点:数据范围

问题描述:

在擦拭桌子的期间,其中一位志愿者发现有的桌子有晃动,聪明的志愿者立马想到了三角形具有稳定性的原理。 为了组成三角形,志愿者找来了三块木棒,长度分别为a,b,c。现在聪明的你能告诉我们这三块木棒能组成等腰三角形吗?

输入:

多组测试数据
输入三个正整数a、b和c,分别代表三角形三条边(a,b,c均在int范围内)

输出:

如果是等腰三角形输出"Yes",否则输出"No"。

样例输入:

1 2 2

样例输出:

Yes



原因分析:

1.虽然题目说  (a,b,c均在int范围内),但是求两边和的时候,有可能超int数据范围,所以int改为long long 就可以了.   

2.只给出了一个示例,会误以为不是多实例,但是题目说多实例输入,所以注意审题.




解决方案:

#include<stdio.h>

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
  {
            long long a,b,c;
    scanf("%lld%lld%%lld",&a,&b,&c)
    if(a+b>c&&a+c>b&&b+c>a)
    {
        if(a==b||a==c||b=c)
            printf("Yes\n");
        else 
            printf("No\n");
    }
    else
        printf("No\n");
  }
}

2.  问题 E: 打印图形  



问题描述:

根据输入的大写英文字母,打印如下形式的图形。 例如,输入G

      A
     AB
    ABC
   ABCD
  ABCDE
 ABCDEF
ABCDEFG

输入:

输入一个大写的英文字母

输出:

输出题目描述的直角三角形

样例输入:

E

样例输出:

    A
   AB
  ABC
 ABCD
ABCDE

原因分析:

本题主要点是 如何利用输入的大写字母变成 数字,从而打印多少行数的问题就解决了.

即 利用  n=x-'A'+1;   创建个数组,存下26个字母


解决方案:

#include<stdio.h>
int main()
{
	int i,j,k,n;
	char a[30]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'},x;
	scanf("%c",&x);
	n=x-'A'+1;
	for(i=1;i<=n;i++)
	{
		for(j=n-i;j>0;j--)
			printf(" ");
		for(k=0;k<i;k++)
			printf("%c",a[k]);
		printf("\n");
	}
	return 0;
}

3. 问题 I: 赛前的准备--轮班

问题描述:

经过了长时间的劳动。志愿者们都疲惫不堪(真心感谢他们),但是还有很多任务。 于是志愿者们想到了一个办法,用三个数来决定那些人来做下一个任务,这样其他人就可以休息了。
规则是这样的:三个数n、m和k,所有人自行选择一个0-9的编号,根据n/m的第k位小数的来决定哪些人来下一个任务,如果n/m的第k位小数为s,那么选择s编号的人休息 。小明太累了,于是请教你怎么能快速得出答案。

输入:

多组测试数据。
每组测试数据输入有三个正整数n,m,k。(1<=n, m<=1000, 1<=k<=100000)

输出:

输出n/m的第k小数位上的数字。

样例输入:

1 2 3
1 3 3

样例输出:

0
3


 


原因分析:

高精度问题,直接按数学方法 模拟即可

1.     int n1=n%m;   举个例子 10/3  之后肯定是其余数进行运算,所以首先取余.

2.      m1=(n1*10)/m;  m1即为小数部分 因为 10/3 余1  下一步应该是数学运算上 10/3  所以 n1*10.并且  /

3.  更新余数        n1=(n1*10)%m;


           


解决方案:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,m,k;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF){
        int n1=n%m;
        int m1=0;
        int sum1=0;
        while(sum1<k){
            m1=(n1*10)/m;
            n1=(n1*10)%m;
            sum1++;
        }
        printf("%d\n",m1);
    }
    return 0;
}


总结:

1. 做题时要 认真 快速 读题,筛去次要信息.

2.int 可以全部 定义为 long long  避免 超出数据范围

3.加油对字符的理解和训练

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值