先看昨天的成果:

C++ 从零单排(3)_i++


勉强冲进前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还是挺重要的。

今天就到这。