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.加油对字符的理解和训练