• C++ 从零单排(3)


    先看昨天的成果:



    勉强冲进前50.


    今天花点时间做一些ACM的水题。

    1.菲波那且数列

    菲波那契(Fibonacci)数(简称菲氏数)定义为:
    ⎧ f (0) = 0

    ⎨ f (1) = 1
    ⎪ f (n) = f (n − 1) + f (n − 2) (n > 1且n ∈ 整数)

    如果写出菲氏数列,则应该是:
    0 1 1 2 3 5 8 13 21 34 ...
    如果求其第 6 项,则应为 8。
    求第 n 项菲氏数。
    输入描述:输入数据含有不多于 50 个的正整数 n(0≤n≤46)。
    输出描述:对于每个 n,计算其第 n 项菲氏数,每个结果应单独占一行。
    输入样例
    6 10
    输出样例
    8
    55

    解答:

    #include <iostream>
    #include <vector>
    #include <numeric>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        //ifstream cin("aaa.txt");
       vector<unsigned int> v;
       unsigned int n;
       v.push_back(0);
       v.push_back(1);
       for(int i=2;i<47;i++)
       {
            v.push_back(v[i-1]+v[i-2]);
       }
       while(cin>>n) cout<<v[n]<<endl;
        return 0;
    }
    


    2.最大公约数

    题目内容

    求两个正整数的最大公约数。
    输入描述:
    输入数据含有不多于 50 对的数据,
    每对数据由两个正整数
    (0 < n1,
    n2 < 232 )
    组成。
    输出描述:对于每组数据 n1 和 n2,计算最大公约数,每个计算结果应占单独一行。
    输入样例
    6 5 18 12
    输出样例
    1
    6

    解答:欧几里德算法(辗转相除)

    #include <iostream>
    #include <vector>
    #include <numeric>
    #include <fstream>
    using namespace std;
    int gcd(int,int);
    int main()
    {
        //ifstream cin("aaa.txt");
        int x,y;
        while(cin>>x>>y)
        {
            cout<<gcd(x,y)<<endl;
        }
        return 0;
    }
    int gcd(int x,int y)
    {
        while(x != y)
        {
            if(x>y) x = x-y;
            else y= y-x;
        }
        return x;
    }
    


    3.求fan数

    正整数的各位数字之和被fans称为Fans数。 求输入数(长度<232)的Fans数!
    Sample Input:

    12345
    56123
    82
    Sample Output:

    15
    17
    10

    解答:

    #include <iostream>
    #include <vector>
    #include <numeric>
    #include <fstream>
    #include <string>
    using namespace std;
    int main()
    {
        //ifstream cin("aaa.txt");
        string s;
        //const int LINE_LENGTH = 233;
        int i,sum;
        //char str[LINE_LENGTH];
        while(cin>>s)
        {
            //s=str;
            sum = 0;
            for(i=0;i<s.length();i++)
            {
                if(s[i]=='0')sum+=0;
                else if(s[i]=='1')sum+=1;
                else if(s[i]=='2')sum+=2;
                else if(s[i]=='3')sum+=3;
                else if(s[i]=='4')sum+=4;
                else if(s[i]=='5')sum+=5;
                else if(s[i]=='6')sum+=6;
                else if(s[i]=='7')sum+=7;
                else if(s[i]=='8')sum+=8;
                else if(s[i]=='9')sum+=9;
            }
            cout<<sum<<endl;
        }
    
    return 0;
    }
    


    4.对称三位数素数

    判断一个数是否为对称三位数素数。所谓“对称”是指一个数,倒过来还是该数。例
    如,375 不是对称数,因为倒过来变成了 573。
    输入描述:输入数据含有不多于 50 个的正整数(0<n< 232 )。
    输出描述:
    对于每个 n,
    如果该数是对称三位数素数,
    则输出
    “Yes”
    ,
    否则输出
    “No”

    每个判断结果单独列一行。
    输入样例
    11 101 272
    输出样例
    No
    Yes
    No

    思路:

    1、三位对称的判断-n>100&&n<1000&&n%10==n/100.

    2、判断是否为素数-让该数除以2到该数的平方根,如果有一个数整除,那么为非素数.

    #include <iostream>
    #include <vector>
    #include <numeric>
    #include <fstream>
    #include <string>
    #include <cmath>
    using namespace std;
    bool isPrime(int n);
    int main()
    {
        //ifstream cin("aaa.txt");
        int n;
        while(cin>>n)
        {
        cout<<(n>100&&n<1000&&n/100==n%10&&isPrime(n)?"Yes\n":"No\n");
        }
    return 0;
    }
    bool isPrime(int n)
    {
        int sqr = sqrt(n*1.0);
        for(int i=2;i<sqr;i++)
        {
            if(n%i==0) return false;
        }
        return true;
    }
    


    5.01串排序

    #include <iostream>
    #include <vector>
    #include <numeric>
    #include <fstream>
    #include <string>
    #include <cmath>
    #include <set>
    #include <algorithm>
    using namespace std;
    struct Comp
    {
        bool operator()(const string &s1,const string &s2)
        {
            if(s1.length()!=s2.length()) return s1.length()<s2.length();
            int c1 = count(s1.begin(),s1.end(),'1');
            int c2 = count(s2.begin(),s2.end(),'1');
            return (c1 != c2 ? c1<c2 : s1<s2);
        }
    };
    int main()
    {
       // ifstream cin("aaa.txt");
        multiset <string,Comp> ms;
        string s;
        while(cin>>s)
        {
            ms.insert(s);
        }
        for(multiset<string,Comp>::iterator it = ms.begin();it!=ms.end();it++)
        {
            cout<<*it<<endl;
        }
    return 0;
    }
    


    由于以前没有A过题,所以上面的都是一些比较水的题,算是练手了。

    C++里面的STL还是挺重要的。

    今天就到这。


  • 相关阅读:
    gettid 和pthread_self的区别
    UDP socket也可以使用connect系统调用
    TCP协议中的SO_LINGER选项
    pthread_key_t和pthread_key_create()详解
    1、Window10 Electron 开发环境搭建
    如何查看Windows下端口占用
    Servlet 中使用POI生成Excel
    JdbcTemplate 操作Oracle Blob
    RedHat 6.5 离线安装 apache2.4.23
    windows下端口被占用的解决方法
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3053827.html
Copyright © 2020-2023  润新知