第五周题解

目录

2016年  1276  Average

1277  Tri-Triangle

 1278  Arithmetic Sequence

2017 1333  Pig Bank

1334  Least Common Multiple

1335  Cycle

2018 1349  Quiz

1350  Triangle

1351  Palindrome

2019  1371  小鸡跳呀跳

 1372  X

 1373  Circle

2020  1391  时间

 1392  面积

1393  锐角三角形


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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值