1. 最长公共连续子串
牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.
输出描述:
输出为一个整数,表示最长公共连续子串的长度。
输入例子:
abcde
abgde
输出例子:
2
完整的C++代码如下:
#include<iostream>
//这段代码没有考虑空格问题,读者可以自行加上,写一个去除空格的函数,将原串
//变成一个新串
using namespace std;
int main()
{
char s1[50];
char s2[50];
gets_s(s1);
gets_s(s2);
int getMaxLength(char *string1, char *string2);
cout << getMaxLength(s1, s2) << endl;
return 0;
}
int getMaxLength(char *string1, char *string2)
{
int a, b, m, Max=0;
int max;
int lastMax[50] = { 0 };//记录每一个元素对应的最长连续子串的长度
int num[50] = { 0 }; //记录每一次内层遍历的结果
int i, j;
int s1len = strlen(string1);
int s2len = strlen(string2);
for (i = 0; i < s1len; i++)
{
for (j = 0; j < s2len; j++)
{
a = i;
b = j;
int count = 0;
while (string1[a] == string2[b]&&a!=s1len&&b!=s2len)
{
count++;
a++;
b++;
}
num[j] = count;//记录每一次内层遍历的结果
}
for ( max=0,m = 0; m < s2len;)
{
while (max < num[m])
{
max = num[m];
}
}
lastMax[i] = max;//记录每一个元素对应的最长连续子串的长度
}
for (m = 0; m < s1len; ) //取出最大的连续子串的长度
{
if (Max < lastMax[m])
{
Max = lastMax[m];
}
}
//cout << max << endl;
return Max;
}
测试结果如下:
2.找整除
牛牛想在[a, b]区间内找到一些数满足可以被一个整数c整除,现在你需要帮助牛牛统计区间内一共有多少个这样的数满足条件?
输入描述:
首先输入两个整数a,b,(-5*10^8 ≤ a ≤ b ≤ 5*10^8)
接着是一个正整数c(1 <= c <= 1000)
输出描述:
输出一个整数表示个数。
输入例子:
0 14 5
输出例子:
3
#include<iostream>
using namespace std;
void getExactDivision(long long int a, long long int b, long int c)
{
int num_an = 0;
int num_bn = 0;
num_bn = b / c;//求出倍数
num_an = a / c;
if (a != 0)//判断是否为0
{
if (b / a<0)//说明 异号
{
cout << (num_bn - num_an + 1);
}
else
cout << (num_bn - num_an);
}
else if (a == 0)
{//等于0
cout << (num_bn - num_an + 1);
}
}
int main()
{
long long int min_an, max_bn;
cin >> min_an >> max_bn;//输入范围
long int num_cn;
cin >> num_cn;
//输入c
getExactDivision(min_an, max_bn, num_cn);
return 0;
}
测试结果如下:
3. 组装三角形
牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。
输入描述:
首先输入一个正整数N,接下来的一行共有N个正整数表示每个木棒的长度。
N ≤ 50, 木棒的长度 ≤ 10000.
输出描述:
输出一个整数表示方法数。
输入例子:
5
1 2 3 4 5
输出例子:
3
说明:要单独判断三角成形的条件,就比较方便。我这里用的最麻烦的多重遍历暴力枚举,应该还有好一些的方法。
完整代码如下:
#include<iostream>
using namespace std;
bool isAngle(int a, int b, int c)
{
bool flag = false;
if (a<b + c && b<a + c && c<a + b)
{
flag = true;
}
return flag;
}
int AssembleTriangle(int N, int Len[50])
{
int count = 0;
for (int i = 1; i <=N; i++)
{
for (int j = i + 1; j<=N; j++)
{
for (int k = j + 1; k<=N; k++)
{
int a = Len[i];
int b = Len[j];
int c = Len[k];
if (isAngle(a, b, c))
{
count++;
}
}
}
}
return count;
}
int main()
{
int num;
cin >> num;
int i = 0;
int length[50] = { 0 };
for (i = 1; i <= num; i++)
cin >> length[i];
cout << AssembleTriangle(num, length) << endl;
return 0;
}
测试结果如下:
4.最小的矩形面积
牛牛在二维坐标系中画了N个点,且都是整点。现在牛牛想画出一个矩形,使得这N个点都在矩形内或者在矩形上。
矩形的边均平行于坐标轴。牛牛希望矩形的面积最小。请你帮助牛牛计算下最小矩形的面积。
输入描述:
首先输入一个正整数N表示点的个数(2 <= N <= 50)
接下来N行每行两个整数x, y,表示该点的坐标。绝对值均小于等于100.
输出描述:
一个整数表示最小矩形的面积。
输入例子:
2
0 1
1 0
输出例子:
1
说明:主要是锁定范围,x轴的长度的最大值乘以y轴的长度的最大值,就是要求解的面积。
完整代码如下:
#include<iostream>
using namespace std;
int getSmallRectangleArea(int xlabel[50], int ylabel[50],int N)
{
int xMax = -65536;
int xMin = 65536;
for (int i = 1; i<=N; i++)
{
if (xlabel[i] > xMax)
{
xMax = xlabel[i];
}
if (xlabel[i] < xMin)
{
xMin = xlabel[i];
}
}
int xLen = xMax - xMin;
int yMax = -65536;
int yMin = 65536;
for (int i = 1; i<=N; i++)
{
if (ylabel[i] > yMax)
{
yMax = ylabel[i];
}
if (ylabel[i] < yMin)
{
yMin = ylabel[i];
}
}
int yLen = yMax - yMin;
int area = xLen * yLen;
return area;
}
int main()
{
int N;
cin >> N;
int x[50], y[50];
for (int i = 1; i <= N; i++)
cin >> x[i] >> y[i];
cout << getSmallRectangleArea(x, y, N) << endl;;
return 0;
}
测试结果如下:
5. 平衡数
牛牛在研究他自己独创的平衡数,平衡数的定义是:将一个数分成左右两部分,分别成为两个新的数。
左右部分必须满足以下两点:
1,左边和右边至少存在一位。
2,左边的数每一位相乘如果等于右边的数每一位相乘,则这个数称为平衡数。
例如:1221这个数,分成12和21的话,1*2=2*1,则称1221为平衡数,再例如:1236这个数,可以分成123和1*2*3=6,所以1236也是平衡数。而1234无论怎样分也不满足平衡数。
输入描述:
输入一个正整数(int范围内)。
输出描述:
如果该数是平衡数,输出 "YES", 否则输出 "NO"。
输入例子:
1221
1234
输出例子:
YES
NO
说明:先将数字按位存放在vector中,在分为两部分分别求解,比较,相等则输出“YES”,没有的话,输出“NO”。
完整代码如下:
#include<iostream>
#include<vector>
using namespace std;
void BalanceNum(int Num)
{
vector<int> vec;
while (Num)
{
int aa;
aa = Num % 10;
vec.push_back(aa); //按位放入数组中
Num = Num / 10;
}
//只有一个数字时,输出“NO”
if (vec.size() == 1)
{
cout << "NO" << endl;
return;
}
for (int i = 0; i<vec.size(); i++)
{
int begin = 1;
int end = 1;
//开始到变量i之间的数字的乘积
for (int j = 0; j<i; j++)
{
begin *= vec[j];
}
//变量i到结束数字的乘积
for (int k = i; k<vec.size(); k++)
{
end *= vec[k];
}
//存在相等的情况输出“YES”,并结束所有判断
if (begin == end)
{
cout<<"YES"<<endl;
return;
}
}
cout << "NO" << endl;
}
int main()
{
int N;
cin >> N;
BalanceNum(N);
return 0;
}
测试结果如下:
6. 字符串分类
牛牛有N个字符串,他想将这些字符串分类,他认为两个字符串A和B属于同一类需要满足以下条件:
A中交换任意位置的两个字符,最终可以得到B,交换的次数不限。比如:abc与bca就是同一类字符串。
现在牛牛想知道这N个字符串可以分成几类。
输入描述:
首先输入一个正整数N(1 <= N <= 50),接下来输入N个字符串,每个字符串长度不超过50。
输出描述:
输出一个整数表示分类的个数。
输入例子:
4
abcd
abdc
dabc
bacd
输出例子:
1
说明:采用vector对原始输入的字符串进行存储,排序,然后在将排好的字符串插入到set中,重复元素不再插入,所以最终set的size就是原始字符串的分类数
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int main()
{
int N;
cin >> N;
vector<string> s(N);
set<string> s1;
for (int i=0; i < N; i++)
cin>>s[i];
for (int i = 0; i < N; i++)
sort(s[i].begin(), s[i].end());
for (int i = 0; i < N; i++)
s1.insert(s[i]); //执行set的插入操作,重复元素不再插入
cout << s1.size() << endl;
return 0;
}
测试结果如下: