一:完全数计算
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注意事项
- 注意头文件的包含:#include<math.h>
- 注意开平方根函数的写法: sqrt()
二:扑克牌大小
2.1题目
- [链接](扑克牌大小_牛客题霸_牛客网 (nowcoder.com))
2.2思路
- 我们可以将牌的状态分为三个:
- 我们就可以根据这三个状态来解析本题:
- 王炸:
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;
}
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注意事项
- 对string类函数的运用:
int count1 = count(s1.begin(),s1.end(),' ');
int count2 = count(s2.begin(),s2.end(),' ');
- count函数可以快速求出牌数
string f1 = s1.substr(0,s1.find(' '));
string f2 = s2.substr(0,s2.find(' '));
substr可以快速得到首牌
3.
string compre("345678910JQKA2jokerJOKER");
创建一个表来比较相同类型值的大小