题目 1 :9数算式
知识点:
stoi()函数:
定义:
作用是将 n 进制的字符串转化为十进制,使用时包含头文件string.
语法:
int stoi( const std::string& str, std::size_t* pos = nullptr, int base = 10 );
参数:
str - 待转换的字符
pos - 其取值可以是一个空字符,在这种情况下,pos未被使用;另外如果pos不是空指针,函数将pos的值设置为str中数字后面的第一个字符的位置。
base - 字符中数字的进制,默认为10进制,如果base取值为0,则进制由字符串中的格式决定。
substr()函数:
定义:
substr()是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。
语法:
substr(size_type _Off = 0,size_type _Count = npos)
参数:
pos:开始位置
len:结束位置
形式 : s.substr(pos, len)
返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
to_string()函数:
定义:
将数字常量转换为字符串,返回值为转换完毕的字符串
语法:
to_string(int n)
参数:
n:数字常量
next_permutation()函数:
定义:
两个用来计算排列组合关系的算法,按字典序全排列
语法:
next_permutation(str.begin(), str.end())
参数:
str.begin():字符串起点
str.end():字符串终点
参数也可为数组类型,第一个参数为数组的起点,第二个参数为数组的终点
思路:
对数字1-9的所有可能组合进行全排列,然后对得出的结果进行判断;因为调换除数的位置算一种做法,因此第一位除数仅需要枚举到第四位数位即可,再往后枚举会得到除数位置调换的结果
代码:
#include<bits/stdc++.h>
using namespace std;
int ans;
//判断结果是否由1-9每一位数字组成
bool check(int n)
{
int vis[10] = {0};
while(n>0)
{
vis[n%10]++;
n/=10;
}
for(int i=1;i<10;i++)
{
if(!vis[i])
return false;
}
return true;
}
int main()
{
string str = "123456789";
do
{
for (int i = 1; i <= 4; i ++ )
{
// 将前i数字转换为十进制,因为调换顺序算一个算式,因此只用枚举到4即可
int a = stoi(str.substr(0, i));
int b = stoi(str.substr(i, 100));
// 计算结果,并判断结果 是否符合规范
if(check(a*b)) ans++;
}
}while(next_permutation(str.begin(), str.end()));//全排列枚举可能性
cout << ans;
}
题目2:山
思路:暴力;因为题目要求是回文,所以仅需要考虑左半部分即可,右半部分直接对称,不做考虑。分奇偶分别进行判断,注意题目要求的是单调不减,因此每一位数字完全相同的情况也算合法情况。
#include <bits/stdc++.h>
using namespace std;
//偶数位数据范围
const int LL = 22, RR = 19999;
//奇数位数据范围,奇数位单调的最大数位为9位,因此因构造五位的单调不减序列
const int LLL = 111, RRR = 99999;
//判断是否单调不减
bool check(int x) {
//判断是否为第一位数
int t = -1;
while (x) {
if (t != -1 && t < x % 10) return false;
t = x % 10;
x /= 10;
}
return true;
}
int main() {
int ans = 0;
// 偶数位
for (int i = LL; i <= RR; ++i) {
if (check(i)) ans++;
}
// 奇数位
for (int i = LLL; i <= RRR; ++i) {
if (check(i)) ans++;
}
cout << ans;
}
题目3:最少刷题数
思路:找到目标刷题数
#include <iostream>
#include <algorithm>
const int maxn=1e5+10;
using namespace std;
int a[maxn], b[maxn];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + n + 1);
// 满足条件的目标刷题数
int ans = -1;
//该目标数的位置
int index = 0;
for (int i = 1; i <= n && ans == -1; ) {
index = i++;
// 移动i指针,跳过相同分数的人
while (i <= n && b[i] == b[i - 1]) i++;
//比较两侧人数
int l = index - 1, r = n - i + 1;
if (l < r) continue;
else if (l > r) ans = b[index];
// 左边等于右边的情况下,多做一道题才能满足条件
else ans = b[index] + 1;
}
for (int i = 1; i <= n; i++) {
if (a[i] < b[index])cout << ans - a[i] << " ";
else cout<<0<<" ";
}
}