CSDN 编程竞赛四十五期题解

竞赛总览

CSDN 编程竞赛四十五期:比赛详情 (csdn.net)

竞赛题解

题目1、勾股数

勾股数是一组构成直角三角形的三个正整数,它们可以作为直角三角形的三条边,比如3 4 5就是一组勾股数。如果给出一组勾股数其中的两个,你能找出余下的第三个吗?

#include 

int main () {
    int a, b, c = -1;
    scanf ("%d %d", &a, &b);
    int a2 = a * a, b2 = b * b;
    for (int i = 1; i < 1000005; i++) {
        int c2 = i * i;
        if (a2 + b2 == c2) { c = i; break; }
        if (a2 + c2 == b2) { c = i; break; }
        if (b2 + c2 == a2) { c = i; break; }
    }
    printf ("%d", c);
    return 0;
}

数据范围不大,直接遍历即可,代码框架如上所示。博主懒得分析边长关系了,因此判断时直接将三种情况都写出来了。实际上,循环中的某些跳出条件可能不会被执行,感兴趣的小伙伴可以再深入分析一下。

当遇到符合条件的第三个数时,还要检测一下其与前两个数在一起是否能构成三角形。若通过校验,说明该数与前两个数可以构成一组勾股数。否则,继续判断下一个数,直到明显不可能得到一组勾股数时,停止检测。根据两边之和大于第三边的三角形边长法则可知,第三边长度c在a+b范围之内。

题目2、最近的回文数

回文数是一个非负整数,它的各位数字从高位到低位和从低位到高位的排列是相同的。以下是一些回文数的例子:0、1、33、525、7997、37273。现在给到一个数,求离它最近的一个回文数(离与它的差的绝对值最小)。如果这个数本身就是回文数,那么就输出它本身。

#include 

int main () {
    long long int n;
    scanf ("%lld", &n);
    long long int num = n;
    long long int fix = 1;
    bool flag = false;
    while (match (num) == false) {
        num += (fix++) * (flag ? +1 : -1);
        flag = flag ? false : true;
    }
    return 0;
}

本题数据范围在int之内,完全可以暴力模拟(上当了,写出来发现实际范围在long long int之内)。

判断回文数的方法很简单。对数据进制数取余,可以得到末尾的数字。再将数据除以进制数,删掉末尾的数字。当数据大于零时,如此往复,即可得到其倒序数值。将倒序数值与原始数值进行比对,如果一致,说明该原始数值为回文数;否则,它不是回文数。也可以将数据当作文本处理,从两边向中间扫描,直到左右指针位置发生交换,如果这个过程中左右两个指针指向的位置上的数字均一致,可以认定该数据为回文数。不过,使用文本的方式来判断回文数,运算起来比较耗时,因此,通常选择前一种方法,除非数据非常大,超过了long long int可表示的范围。

根据回文数判断方法,从给定的数值中心向两侧扩展,判断其+1、-1、+2、-2等数值是否为回文数,直到遇到符合条件的答案。

你可能感兴趣的:(CSDN,竞赛题解,算法,c++)