【CSDN竞赛第45期】C++题解

【CSDN竞赛第45期】C++题解

勾股数

  • 问题:

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

  • 算法思想:

    如果两个数的平方和或平方差的绝对值为整数,则说明这个数是个平方数,它存在

#include
using namespace std;
int main(){
    double a,b;
    cin>>a>>b;
    if(a == b){
        cout<<-1<<endl;
        return 0;
    }
    if(sqrt(a*a+b*b) == (int)sqrt(a*a+b*b)){
        cout<<sqrt(a*a+b*b)<<endl;
        return 0;
    }
    if(sqrt(abs(a*a-b*b)) == (int)sqrt(abs(a*a-b*b))){
        cout<<sqrt(abs(a*a-b*b))<<endl;
    }
    return 0;
}

最近的回文数

  • 问题:

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

  • 算法思想:

    离它最近的回文数,就是让前面后后面对称,只有这样才会是回文数。而要让它最近,就应该从后面的地位开始加或者减直到得到回文数,首先想到的是++或–进行枚举,但是这样复杂度太高了我有点无法接受(但是也能过)。换一个思路,要让回文数离目前这个数最小,就用末位开始修改,所以我直接扫描,如果末位与对应的高位不相等,就把末变为高位这个数,这样的回文数满足题意,复杂度也低。

#include
using namespace std;
int main(){
    string s;
    cin>>s;
    int len = s.length();
    if(len % 2){
        len /= 2;
    }else{
        len = (len / 2) - 1;
    }
    for(int i=0;i < len;i++){
        if(s[i] != s[s.length() - i - 1]){
            s[s.length() - i - 1] = s[i];
        }
    }
    cout<<s<<endl;
    return 0;
}

接下来是判断题和选择填空题

量子计算之所以有如此高的计算效率,根本原因是它突破了二进制。

我的理解:二进制不是0就是1,速度非常快,如果不使用二进制,可能会让执行逻辑更复杂,所以我认为量子计算机的快,并不是因为其突破二进制,而是其他的质的突破,这种突破能够完全取代二进制的简洁优势。

第一个用模块化原理实现可编程计算机的是谁? 康拉德·楚泽。

Z系列计算机和几百年前的差分机使用的部件数量基本相当,尤其是Z1也是纯机械实现的,前者却可以在较少的人力和预算下得以成功完成,以下哪一项不属于Z系列计算机的关键成功因素? 得到了政府的资助,并且有得力的助手

从数学上奠定了可计算问题的理论基础的,或者说计算机的数学模型是 图灵机

你可能感兴趣的:(c++,开发语言)