写点什么

牛客刷题系列 (完全数计算, 扑克牌大小)

作者:Geek_8c56e5
  • 2022-10-19
    湖南
  • 本文字数:1786 字

    阅读完需:约 1 分钟

一:完全数计算

1.1 题目:

链接


1.2 思路

  • 根据完全数的定义写就好了

  • 注意循环

1.3 旧版本

#include<iostream>using namespace std;
int Count_Of_Perfect_Number(int n){int count = 0, sum = 0;for(int i=2; i<=n; ++i){ for(int j=1; j<i; ++j) //效率不高 { if(i % j == 0) //对约数进行求和 sum += j; } if(sum == i) count++; sum = 0; } return count;}
int main(){ int n, count; while(cin >> n) { count = Count_Of_Perfect_Number(n); cout<<count<<endl;}return 0;}
复制代码


for(int j=1; j<i; ++j) 将 i 全部遍历了一遍,时间复杂度为 O(n),效率不高

1.4 效率高的版本

#include<iostream>#include<algorithm>#include<math.h>using namespace std;
int Count(int n){int count = 0, sum = 0;for(int i=2; i<=n; ++i){ for(int j=1; j<=sqrt(i); ++j) { if(i % j == 0) //对约数进行求和 { sum += j; if( i/j != sqrt(i) && j!=1) { sum += i/j; } } } if(sum == i) count++; sum = 0; } return count;}
int main(){ int n, count; while(cin >> n) { count = Count(n); cout<<count<<endl;}return 0;}
复制代码


if(i % j == 0) //对约数进行求和{sum += j;if( i/j != sqrt(i) && j!=1){sum += i/j;}}

将 O(n)的时间复杂度降到了 O(logn)

1.5 注意事项

  1. 注意头文件的包含:#include<math.h>

  2. 注意开平方根函数的写法: sqrt()

二:扑克牌大小

2.1 题目


2.2 思路

  • 我们可以将牌的状态分为三个:



  • 我们就可以根据这三个状态来解析本题:


  1. 王炸:


  if(s1.size() ==11 || s2.size()==11) //王炸  {       if(s1.size() == 11)           cout<<s1;      else          cout<<s2;  }
复制代码


  1. 普通炸


  else if(s1.size() == 7 || s2.size() == 7) // 普通炸  {       if(s1.size() == 7 && s2.size() == 7)           cout<<(s1[0]>s2[0]?s1:s2);       else if(s1.size() !=7)           cout<<s2;      else           cout<<s1;  }
复制代码


  1. 其他:


   else   {      int count1 = count(s1.begin(),s1.end(),' ');      int count2 = count(s2.begin(),s2.end(),' ');            if(count1 != count2)      {          cout<<"ERROR";          return 0;      }      string compre("345678910JQKA2jokerJOKER");      string f1 = s1.substr(0,s1.find(' '));      string f2 = s2.substr(0,s2.find(' '));      if(compre.find(f1) >compre.find(f2))      cout<<s1;      else        cout<<s2;   }
复制代码

2.3 代码实现

#include<iostream>#include<string>#include<algorithm>using namespace std;
int main(){ string s; getline(cin,s); int pos = s.find('-'); string s1(s.begin(),s.begin()+pos); string s2(s.begin()+pos+1,s.end()); if(s1.size() ==11 || s2.size()==11) //王炸 { if(s1.size() == 11) cout<<s1; else cout<<s2; } else if(s1.size() == 7 || s2.size() == 7) // 普通炸 { if(s1.size() == 7 && s2.size() == 7) cout<<(s1[0]>s2[0]?s1:s2); else if(s1.size() !=7) cout<<s2; else cout<<s1; } else { int count1 = count(s1.begin(),s1.end(),' '); int count2 = count(s2.begin(),s2.end(),' '); if(count1 != count2) { cout<<"ERROR"; return 0; } string compre("345678910JQKA2jokerJOKER"); string f1 = s1.substr(0,s1.find(' ')); string f2 = s2.substr(0,s2.find(' ')); if(compre.find(f1) >compre.find(f2)) cout<<s1; else cout<<s2; } return 0;}
复制代码

2.4 注意事项

  1. 对 string 类函数的运用:


          int count1 = count(s1.begin(),s1.end(),' ');
          int count2 = count(s2.begin(),s2.end(),' ');
    
    • count 函数可以快速求出牌数

    1. substr 可以快速得到首牌

    2. 创建一个表来比较相同类型值的大小

    用户头像

    Geek_8c56e5

    关注

    还未添加个人签名 2022-04-28 加入

    还未添加个人简介

    评论

    发布
    暂无评论
    牛客刷题系列(完全数计算,扑克牌大小)_Geek_8c56e5_InfoQ写作社区