目录
2016年 1276 Average
思路: 计算a和b的平均值(注意使用浮点类型),然后分类讨论。注意到样例输出无多余的0,所以用%g输出。
代码:
#include <stdio.h> int main() { int k; double a, b, av; scanf("%d", &k); while (k--) { scanf("%lf%lf", &a, &b); av = (a + b) / 2; if (a == b) { printf("None\n"); } else if (a < b) { printf("Alice %g\n", av - a); } else { printf("Bob %g\n", av - b); } } return 0; }
1277 Tri-Triangle
思路 :打印图表题一般就是找规律,利用循环输出各部分字符,可以对一个样例分析其各个部分的规律
代码:
#include <stdio.h> int main() { char c; int k, i, j; while (scanf("%c", &c) != EOF) { //注意结束输入的用法 k = c - 'A' + 1; //将字母转化为对应整数 for (i = 0; i < k; i++) { //打印上半部分 for (j = 2 * k - 1 - i; j > 0; j--) { //打印左边空格 printf(" "); } for (j = 0; j < i + 1; j++) { //打印左半字符 printf("%c", 'A' + j); } for (j = i; j > 0; j--) { //打印右半字符 printf("%c", 'A' - 1 + j); } printf("\n"); //换行 } for (i = 0; i < k; i++) { //打印下半部分 for (j = k - 1 - i; j > 0; j--) //打印第一个字符三角形左半部分 printf(" "); for (j = 0; j < i + 1; j++) { //打印第一个字符三角形左半部分 printf("%c", 'A' + j); } for (j = i; j > 0; j--) { //打印第一个字符三角形右半部分 printf("%c", 'A' - 1 + j); } for (j = 2 * (k - 1 - i) + 1; j > 0; j--) //打印中间空格 printf(" "); for (j = 0; j < i + 1; j++) { //打印第二个字符三角形左半部分 printf("%c", 'A' + j); } for (j = i; j > 0; j--) { //打印第二个字符三角形右半部分 printf("%c", 'A' - 1 + j); } printf("\n"); //换行 } } return 0; }
1278 Arithmetic Sequence
思路:用一个flag变量作标记,先假设它是一个等差数列,令flag=1,计算第一个元素和第二个元素的差值记为k;然后从第三个元素开始,遍历数组,将每个元素与前一个元素作差,看结果是不是等于k,如果不是,令flag=0,调出循环,然后根据flag判断输出
代码:
#include <stdio.h> int a[10005]; //定义全局变量数组,默认数组各值为0 int main() { int t, n, i, k, flag; scanf("%d", &t); while (t--) { flag = 1; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &a[i]); k = a[1] - a[0]; for (i = 2; i < n; i++) { if (a[i] - a[i - 1] != k) { flag = 0; break; } } if (flag) printf("Yes\n"); else printf("No\n"); } return 0; }
2017 1333 Pig Bank
思路:注意一下细节,有三种情况
#include <stdio.h> int main() { int a, b, c, ans, t; scanf("%d", &t); while (t--) { scanf("%d%d%d", &a, &b, &c); if (a >= c) { //如果已有的钱大于要存的钱,直接输出0 printf("0\n"); } else if ((c - a) % b == 0) printf("%d\n", (c - a) / b); else { //不能被整除的话要加1 printf("%d\n",((c - a) / b + 1)); } } return 0; }
1334 Least Common Multiple
思路:利用三重循环,枚举出所有的可能,取其最小值。求三个数的最小公倍数就是先求其中两个数的最小公倍数然后再求和第三个数的最小公倍数。注意本题数据最大是10的6次方,如果是三个很大的质数求它们的最小公倍数,就会爆int,所用要用64位整数。
代码:
#include <stdio.h> #define maxn 1e18 __int64 gcd(__int64 a, __int64 b) { return b ? gcd(b, a % b) : a; } __int64 lcm(__int64 a, __int64 b) { return a / gcd(a, b) * b; } int main() { int num, n, i, j, k; __int64 min; __int64 a[55] = {0}; scanf("%d", &num); while (num--) { min = maxn; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%I64d", &a[i]); } for (i = 0; i <= n - 3; i++) { for (j = i + 1; j <= n - 2; j++) { for (k = j + 1; k <= n - 1; k++) { if (min > lcm(a[i], lcm(a[j], a[k]))) { min = lcm(a[i], lcm(a[j], a[k])); } } } } printf("%I64d\n", min); } return 0; }
1335 Cycle
思路:最简单的方法遍历[-r,r]的整数,找到符合的整数,这里是遍历1/4圆上的点,最后结果就是*4再减去4个重复的点
#include <stdio.h> int main() { int t, r, i, j, ans; scanf("%d", &t); while (t--) { ans = 0; scanf("%d", &r); for (i = 0; i <= r; i++) { for (j = 0; j <= r; j++) { if (i * i + j * j == r * r) { ans++; } } } printf("%d\n", 4 * ans - 4); } return 0; }
2018 1349 Quiz
答案:BDACD 这下面两个是比较少见的,大家可以参考一下。还有的知识不了解的可以看一下c语言教材或者在网上搜,要善于利用资源。这种题出的很少,大家不用太担心。
未定义行为: C语言未定义行为_wushuomin的博客-CSDN博客
指针的类型和指针所指向的类型说明_gwonph的博客-CSDN博客_指针类型和指针指向的类型
1350 Triangle
思路:利用三角形射影定理求出对应的高,如图
代码:
#include <stdio.h> int main() { int t; double x; scanf("%d", &t); while (t--) { scanf("%lf", &x); printf("%.3lf\n", sqrt(1 - x * x)); } return 0; }
1351 Palindrome
思路:因为是无限次交换相邻位置,所以原来的位置并不重要,重要的是字符串里面各个字符的数量以及字符串的长度。如果字符串长度是偶数,那么字符串中出现的各个字符必须都是偶数个,否则最多有一个字符的个数是奇数。
代码:
#include <stdio.h> #include <string.h> int main() { char s[1005]; int len, flag; while (gets(s) != NULL) { int a[26] = {0}; flag = 1; len = strlen(s); //利用strlen()函数计算字符串的长度,要包含string.h头文件 for (int i = 0; i < len; i++) a[s[i] - 'a']++; //s[i]-'a'就相当于该字符对应的整数,a对应0,b对应1··· if (len % 2 == 0) { // a[s[i]-'a']++,就是把这个字符的数量加一 for (int i = 0; i < 26; i++) { //遍历查找出现奇数次的字符,若果有令标记 if (a[i] % 2 != 0) { //flag=0 ,跳出循环 flag = 0; break; } } } else { for (int i = 0; i < 26; i++) { if (a[i] % 2 != 0 && flag == 1) { //第一次出现一个奇数次的字符,令flag=2, flag=2; //进行下一次循环 continue; } if (a[i] % 2 != 0) { //再出现奇数次的字符令flag=0,表示不符合回 flag = 0; //文串,跳出循环 break; } } } if (flag) printf("Yes\n"); else printf("No\n"); } return 0; }
2019 1371 小鸡跳呀跳
思路:根据题目意思,用flag来表示连续获得的金币数,遍历字符串,计算得分
代码:
#include <stdio.h> #include <string.h> int main() { int t, i, ans, cnt, len, flag; char s[205]; scanf("%d", &t); while (t--) { scanf("%s", s); flag = cnt = ans = 0; len = strlen(s); for (i = 0; i < len; i++) { if (s[i] == '#') { //遇到‘#’表示结束,输出分数 printf("%d\n", ans); } else if (s[i] == 'O') { //遇到金币,根据已获得金币来加上对应的分数 if (flag == 0) ans += 20; else if (flag == 1) ans += 30; else if (flag == 2) ans += 40; else ans += 50; flag++; //并令flag加1 } else { //否则遇到‘X’,flag要清0 flag = 0; } } } return 0; }
1372 X
思路:见代码
代码:
#include <stdio.h> #include <string.h> int main() { int n, i, j; char c; while (scanf(" %c", &c) != EOF) { n = c - 'A' + 1; //计算字母对应数字 for (i = 0; i < n; i++) { //打印X以上部分 for (j = 0; j < i; j++) //打印空格 printf(" "); printf("%c", c - i); //打印字母 for (j = 2 * (n - i) - 1; j > 0; j--) //打印空格 printf(" "); printf("%c\n", c - i); //打印字母 } for (i = 0; i < n; i++) //同上半部分,但规律不同 printf(" "); printf("X\n"); for (i = 0; i < n; i++) { for (j = n - 1 - i; j > 0; j--) printf(" "); printf("%c", 'A' + i); for (j = 0; j < 2 * i + 1; j++) printf(" "); printf("%c\n", 'A' + i); } } return 0; }
1373 Circle
思路:利用圆的相关知识,计算两圆圆心的距离,与半径进行比较即可
代码:
#include <stdio.h>
#include <math.h>
int main() {
int t;
scanf("%d", &t);
while (t--) {
double x1, x2, y1, y2, r1, r2, d, rmax, rmin;
scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &r1, &x2, &y2, &r2);
rmax = r1 + r2;
rmin = abs(r1 - r2);
d = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
if (d < rmin)
printf("1\n");
else if (d == rmin)
printf("2\n");
else if (d < rmax)
printf("3\n");
else if (d == rmax)
printf("4\n");
else
printf("5\n");
}
return 0;
}
2020 1391 时间
思路:对输入的数n依次对3600(小时),60(分钟)先进行整除得到对应的商分情况输出,再对n进行取余得到整除之后的数
代码:
#include <stdio.h> int main() { int t, n; int h, m; scanf("%d", &t); while (t--) { h = m = 0; scanf("%d", &n); h = n / 3600; if (h <= 9) { //如果是一位数要手动加0 printf("0%d", h); } else printf("%d", h); n %= 3600; m = n / 60; if (m <= 9) { printf(":0%d", m); } else printf(":%d", m); n %= 60; if (n <= 9) { printf(":0%d\n", n); } else printf(":%d\n", n); } return 0; }
1392 面积
思路:数学问题,求出公式即可
代码:
#include <stdio.h> int gcd(int a, int b) { //求最大公因数 return b ? gcd(b, a % b) : a; } int main() { int t, a, b, x, y, k; scanf("%d", &t); while (t--) { scanf("%d%d", &a, &b); x = (2 * a + b) * (a * a + b * b); y = 2 * (a + b); k = gcd(x, y); x /= k; y /= k; if (y == 1) //结果是整数,直接输出 printf("%d\n", x); else printf("%d/%d\n", x, y); } return 0; }
1393 锐角三角形
思路:利用余弦定理,如果最大角的余弦值大于0,则为锐角三角形。再用三重循环遍历所有的边对符合条件的进行计数。
代码:
#include <stdio.h> #include <stdlib.h> int cmp_int(const void *a, const void *b) { return *(int *)a - *(int *)b; } int f(int a, int b, int c) { if (b * b + a * a - c * c > 0 ) //a<=b<=c,则a*a+b*b-c*c对应的值则为最大角的余弦值,想想为什么 return 1; else return 0; } int main() { int e[105] = {0}; int n, num, i, j, k, cnt; scanf("%d", &num); while (num--) { cnt = 0; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d", &e[i]); } qsort(e, n, sizeof(e[0]), cmp_int); //调用快排函数(升序),你们可以自己用冒泡排序或者选择排序写一个 for (i = 0; i <= n - 3; i++) { for (j = i + 1; j <= n - 2; j++) { for (k = j + 1; k <= n - 1; k++) { if (f(e[i], e[j], e[k])) cnt++; } } } printf("%d\n", cnt); } return 0; }