代码见github
没啥好说的,就是要对原字符串预处理一下。
#include
#include
#include
#include
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
for(int i=0;iif(!(std::isalpha(str[i])||str[i]==' '))
{
str[i]=' ';
}
}
stringstream ss(str);
string w;
vector<string>v;
while(ss>>w)
{
v.push_back(string(w.rbegin(),w.rend()));
}
string tmp;
for(int i=0;i" ";
}
tmp.pop_back();
string res(tmp.rbegin(),tmp.rend());
cout<return 0;
}
最长回文子串,有很多方法,我的方法比较蠢。
求出回文子串,然后比较长度。
求回文子串的方法有很多,比较高效的是从中间往左右扩散。
#include
#include
using namespace std;
string subPalindrome(string s, int left, int right)
{
int strLen = s.length();
while (left >= 0 && rightreturn s.substr(left, right - left + 1);
}
int main()
{
string str;
while (cin >> str)
{
int mm = 0;
int n = str.size();
for (int i = 0; i < n; ++i)
{
string sub1 = subPalindrome(str, i, i);
int l = sub1.size();
if (l > mm)
mm = l;
string sub2 = subPalindrome(str, i, i + 1);
int r = sub2.size();
if (r > mm)
mm = r;
}
cout << mm << endl;
}
return 0;
}
这个就是socket编程的运用了,注意大小端存储即可,
#include
#include
#include
#include
#include
using namespace std;
unsigned long Ip2Num(string ip)
{
struct sockaddr_in addr;
inet_pton(AF_INET,ip.c_str(),(void*)&addr.sin_addr);
unsigned long rs=addr.sin_addr.s_addr;
rs=htonl(rs);
return rs;
}
string Num2Ip(unsigned long num)
{
struct sockaddr_in addr;
addr.sin_addr.s_addr=ntohl(num);
char buff[16];
inet_ntop(AF_INET,(void*)&addr.sin_addr,buff,16);
string ss(buff);
return ss;
}
int main()
{
string ip;
unsigned int num;
while(cin>>ip>>num)
{
unsigned long r1=Ip2Num(ip);
string r2=Num2Ip(num);
cout<
std::sort
即可
#include
#include
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
sort(str.begin(),str.end());
cout<return 0;
}
有意思的题,把高中算数列的本事都拿出来了,最后算出一个公式,直接赋值即可。 v[i][j]=(j+3+2∗i)∗j/2+(i+1)∗i/2+1
#include
#include
using namespace std;
int main()
{
int n;
while (cin >> n)
{
vector<vector<int>>v(n, vector<int>(n));
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n - i; ++j)
{
v[i][j]=(j + 3 + 2 * i)*j / 2 + (i + 1)*i / 2 + 1;
}
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n - i; ++j)
{
if(j==0)
{
cout<continue;
}
cout <<" "<< v[i][j];
}
cout << endl;
}
}
}
加密其实就是对字符进行hash,具体操作就是key要去掉重复字符,并且不改变原字符在key中的序列,比如ACCD,变成ACD。
hash的过程,是将上述key按顺序排列在26个字母之下,一一对应:
[ABC]DEFGHI…..Z
[ACD]BEFG……..
不足的地方补齐,且不重复出现,这样就出现了一个一一对应关系,例如:
明文是D,密文是B等等。
理解题意之后就很简单了,注意大小写处理:
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string key;
string str;
//char m[26];
while (getline(cin,key))
{
getline(cin, str);
int m[26] = { 0 };
string dict;
for (int i = 0; i < key.size(); ++i)
{
if (m[tolower(key[i]) - 'a'] == 0)
{
dict += tolower(key[i]);
m[tolower(key[i]) - 'a'] = 1;
}
}
for (int i = 0; i < 26; ++i)
{
if (m[i] == 0)
{
dict += 'a' + i;
}
}
// cout << dict << endl;
for (int i = 0; i < str.size(); ++i)
{
if (!isalpha(str[i]))
continue;
bool islower = true;
if (str[i] <= 'Z'&&str[i] >= 'A')
islower = false;
str[i] = dict[tolower(str[i]) - 'a'];
if (!islower)
str[i] = toupper(str[i]);
}
cout << str << endl;
}
return 0;
}
斐波拉切数列的应用
#include
#include
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==1)
cout<<1<else if(n==2)
cout<<1<else if(n==3)
cout<<2<else
{
vector<int>a(n+1);
a[1]=1;
a[2]=1;
a[3]=2;
for(int i=4;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
cout<return 0;
}
数学题,画个图计算一下即可。
#include
#include
using namespace std;
int main()
{
int n;
while (cin >> n)
{
double r1 = n;
for (int i = 0; i < 4; ++i)
{
r1 += static_cast<double>(n) / (pow(2,i));
}
double r2 = n*pow(0.5, 5);
cout << r1 << endl << r2 << endl;
}
return 0;
}
[这题未通过]但柑橘题目的输入应该是有问题的。我的思路还是要利用socket函数,算出掩码和IP,这样在同一子网下的两个ip与上掩码的值是相等的。
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string mask;
string ip1;
string ip2;
while(cin>>mask>>ip1>>ip2)
{
unsigned long maskNum=0;
unsigned long ip1Num=0;
unsigned long ip2Num=0;
struct sockaddr_in addr;
int ret;
ret = inet_pton(AF_INET,mask.c_str(),(void*)&addr.sin_addr);
if(ret!=1)
{
cout<<1<continue;
}
ret = inet_pton(AF_INET,ip1.c_str(),(void*)&addr.sin_addr);
if(ret!=1)
{
cout<<1<continue;
}
ret = inet_pton(AF_INET,ip2.c_str(),(void*)&addr.sin_addr);
if(ret!=1)
{
cout<<1<continue;
}
maskNum=htonl(addr.sin_addr.s_addr);
ip1Num=htonl(addr.sin_addr.s_addr);
ip2Num=htonl(addr.sin_addr.s_addr);
if((maskNum&ip1Num)==(maskNum&ip2Num))
cout<<0<else
cout<<2<//cout <<((maskNum&ip1Num)==(maskNum&ip2Num))<
}
}
没啥好说。
#include
#include
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
int alpha=0;
int digit=0;
int other=0;
int space=0;
for(int i=0;iif(str[i]==' ')
space++;
else if(std::isalpha(str[i]))
alpha++;
else if(std::isdigit(str[i]))
digit++;
else
other++;
}
cout<cout<cout<cout<