越做越觉得非科班出身的艰难。。。要不还是老老实实画图去?
好吧 再来一题:给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”
这个就是简单的循环归类。。。找出每个字符串相同字符的个数,来看代码
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int num;
while (cin >> num)
{
string str;
vector<string> vec;
vector<int> vec1;
vector<int> vec2;
for (int i = 0; i < num; i++)
{
cin >> str;
vec.push_back(str);
}
for (int i = 0; i < vec.size(); i++)
{
vec1.clear();
int sum = 0;
for (char j = 'a'; j <= 'z'; j++)
{
int n = 0;
for (int k = 0; k < vec[i].size(); k++)
{
if (j == vec[i][k])
{
n++;
}
}
vec1.push_back(n);
}
sort(vec1.begin(), vec1.end());
int s = 26;
for (int j = vec1.size() - 1; j >= 0; j--)
{
sum += s*vec1[j];
s--;
}
vec2.push_back(sum);
}
for (int i = 0; i < vec2.size(); i++)
{
cout << vec2[i] << endl;
}
}
return 0;
}
来看这题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF"6,应该输出为"我ABC"而不是"我ABC+汉的半个"。
这题其实只要用直接输出就行,因为字符串会自动判断是不是半个字节的问题
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
string str;
while (cin >> str)
{
cin >> n;
int num = 0;
while (n)
{
cout << str[num];
num++;
n--;
}
cout << endl;
}
return 0;
}
来看这一题,输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37...70,71,72,73...)的个数(一组测试用例里可能有多组数据,请注意处理) 比较简单,来看代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int num;
while (cin >> num)
{
vector<int> vec;
int n = 0;
for (int i = 1; i <= num; i++)
{
vec.clear();
if (i % 7 == 0)
{
n++;
continue;
}
else
{
int k = i;
while (k)
{
vec.push_back(k % 10);
k = k / 10;
}
for (int j = 0; j < vec.size(); j++)
{
if (vec[j] == 7)
{
n++;
break;
}
}
}
}
cout << n << endl;
}
return 0;
}
再来一题:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000
返回n以内完全数的个数。 异常情况返回-1 来看代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int num;
while (cin >> num)
{
int n = 0;
for (int i = 1; i <= num; i++)
{
vector<int> vec;
for (int j = 1; j < i; j++)
{
if (i%j == 0)
{
vec.push_back(j);
}
}
int sum = 0;
for (int j = 0; j < vec.size(); j++)
{
sum += vec[j];
}
if (sum == i)
{
n++;
}
}
cout << n << endl;
}
return 0;
}
来看到弱智题 输入n个整数,输出其中最小的k个。来看代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int a, b;
while (cin >> a >> b)
{
vector<int> vec;
for (int i = 0; i < a; i++)
{
int n;
cin >> n;
vec.push_back(n);
}
sort(vec.begin(), vec.end());
for (int i = 0; i < b; i++)
{
if (i != b - 1)
{
cout << vec[i]<<" ";
}
else
{
cout << vec[i] << endl;
}
}
}
return 0;
}
来看下一题
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str;
while (cin >> str)
{
int n;
for (int i = 0; i < str.size(); i++)
{
n = 0;
for (int j = 0; j < str.size(); j++)
{
if (str[i] == str[j])
{
n++;
}
}
if (n == 1)
{
cout << str[i] << endl;
break;
}
}
if (n > 1)
{
cout << -1 << endl;
}
}
return 0;
}
再来看一题:任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对 来看代码
#include<iostream>
using namespace std;
int main()
{
int num;
while (cin >> num)
{
int ifok = 0;
for (int i = num / 2; i > 0; i--)
{
if (i > 2)
{
int n = 2;
for (int k = 2; k < i; k++)
{
n++;
if (i%k == 0)
{
break;
}
}
if (n == i)
{
int m = 2;
for (int k = 2; k < num - i; k++)
{
m++;
if ((num - i) % k == 0)
{
break;
}
}
if (m == num - i)
{
ifok = 1;
cout << i << endl;
cout << num - i << endl;
}
}
if (ifok == 1)
{
break;
}
}
else
{
cout << i << endl;
cout << num - i << endl;
}
}
}
return 0;
}
再来一题 计算整数二进制中1的个数 题目比较简单 参考代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n1;
while (cin >> n1)
{
vector<int> vec;
int sum = 0;
while (n1)
{
int n = n1 % 2;
vec.push_back(n);
n1 = n1 / 2;
}
for (int i = 0; i < vec.size(); i++)
{
if (vec[i] == 1)
{
sum++;
}
}
cout << sum << endl;
}
return 0;
}
来看这一题:
一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。
题目比较简单,需要截取字符串函数substr来看具体代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
int num;
while (cin >> str)
{
cin >> num;
double rate = 0;
string res;
for (int i = 0; i < str.size() - num + 1; i++)
{
int sum = 0;
string str1 = str.substr(i, num);
for (int k = 0; k < str1.size(); k++)
{
if (str1[k] == 'G' || str1[k] == 'C')
{
sum++;
}
}
double currate = sum / double(num);
if (currate > rate)
{
rate = currate;
res = str1;
}
}
cout << res << endl;
}
return 0;
}
再来一题,不得不说一句,往后走热度越少,我觉得虽天赋很重要,凡事还是贵在坚持。。。好了来看这题
这题的关键在于定位是哪首歌以及歌出现的位置,来看代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int num;
string str;
while (cin >> num)
{
cin >> str;
if (num > 4)
{
int ini = 1;
int locate = 1;
for (int i = 0; i < str.size(); i++)
{
if (str[i] == 'U')
{
if (ini == 1)
{
ini = num;
locate = 4;
}
else
{
ini = ini - 1;
locate -= 1;
if (locate == 0)
{
locate+=1;
}
}
}
else if (str[i] == 'D')
{
if (ini == num)
{
ini = 1;
locate = 1;
}
else
{
ini = ini + 1;
locate += 1;
if (locate == 5)
{
locate-=1;
}
}
}
}
if (locate == 1)
{
cout << ini << " " << ini + 1 << " " << ini + 2 << " " << ini + 3 << endl;
cout << ini << endl;
}
else if (locate == 2)
{
cout << ini - 1 << " " << ini << " " << ini + 1 << " " << ini + 2 << endl;
cout << ini << endl;
}
else if (locate == 3)
{
cout << ini - 2 << " " << ini - 1 << " " << ini << " " << ini + 1 << endl;
cout << ini << endl;
}
else if (locate == 4)
{
cout << ini - 3 << " " << ini - 2 << " " << ini - 1 << " " << ini << endl;
cout << ini << endl;
}
}
else
{
int ini = 1;
int locate = 1;
for (int i = 0; i < str.size(); i++)
{
if (str[i] == 'U')
{
if (ini == 1)
{
ini = num;
}
else
{
ini = ini - 1;
}
}
else if (str[i] == 'D')
{
if (ini == num)
{
ini = 1;
}
else
{
ini = ini + 1;
}
}
}
for (int i = 1; i <= num; i++)
{
if (i != num)
{
cout << i << " ";
}
else
{
cout << i << endl;
}
}
cout << ini << endl;
}
}
return 0;
}
再来看一题:查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个
这题比较简单 我的思路是先找到起始位置相同的,然后开始自增,比较,返回。来看代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1, str2;
while (getline(cin, str1))
{
getline(cin, str2);
if (str1.size() > str2.size())
{
string cur = str2;
str2 = str1;
str1 = cur;
}
int max = 0;
string str;
for (int i = 0; i < str1.size(); i++)
for (int j = 0; j < str2.size(); j++)
{
if (str1[i] == str2[j])
{
int k = 0;
while (str1[i + k] == str2[j + k] && (i + k)<str1.size() && (j + k)<str2.size())
{
k++;
}
if (max < k)
{
max = k;
str = str1.substr(i, k);
}
}
}
cout << str << endl;
}
return 0;
}
周末了,做一道弱智题轻松下,公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? 来看代码:
#include<iostream>
using namespace std;
int main()
{
int num;
while (cin >> num)
{
for (int i = 0; i <= 20; i++)
for (int j = 0; j <= 33; j++)
for (int k = 0; k <= 300; k = k + 3)
{
if (i * 5 + j * 3 + k / 3 == 100 && i + j + k == 100)
{
cout << i << " " << j << " " << k << endl;
}
}
}
return 0;
}
来看这一题:
根据输入的日期,计算是这一年的第几天。。
详细描述:
输入某年某月某日,判断这一天是这一年的第几天?。 参考代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int a, b, c;
while (cin >> a)
{
int num = 0;
cin >> b >> c;
int mon[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (a % 4 == 0)
{
mon[1] = 29;
for (int i = 0; i < b-1; i++)
{
num += mon[i];
}
num += c;
}
else
{
mon[1] = 28;
for (int i = 0; i < b-1; i++)
{
num += mon[i];
}
num += c;
}
cout << num << endl;
}
return 0;
}
来看这一题,其实做多了感觉很多都是大同小异 计算两个字符串的最大公共字串的长度,字符不区分大小写
来看代码:
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
int num = 0;
for (int i = 0; i < str1.size(); i++)
{
if (str1[i] >= 'A'&&str1[i] <= 'Z')
{
str1[i] += 32;
}
}
for (int i = 0; i < str2.size(); i++)
{
if (str2[i] >= 'A'&&str2[i] <= 'Z')
{
str2[i] += 32;
}
}
for (int i = 0; i < str1.size(); i++)
{
for (int j = 0; j < str2.size(); j++)
{
if (str1[i] == str2[j])
{
int n = 0;
int k = i, w = j;
while (str1[k] == str2[w] && k<str1.size() && w<str2.size())
{
k++;
w++;
n++;
}
if (num < n)
{
num = n;
}
}
}
}
cout << num;
}
return 0;
}