依然是做的仿真卷~
7-1 多二了一点 (15分)
若一个正整数有 2n 个数位,后 n 个数位组成的数恰好比前 n 个数位组成的数多 2,则称这个数字“多二了一点”。如 24、6668、233235 等都是多二了一点的数字。
给定任一正整数,请你判断它有没有多二了那么一点。
输入格式:
输入在第一行中给出一个正整数 N(≤ 1 0 1000 10^{1000} 101000)。
输出格式:
在一行中根据情况输出下列之一:
- 如果输入的整数没有偶数个数位,输出
Error: X digit(s)
,其中X
是 N 的位数; - 如果是偶数位的数字,并且是多二了一点,输出
Yes: X - Y = 2
,其中X
是后一半数位组成的数,Y
是前一半数位组成的数; - 如果是偶数位的数字,但并不是多二了一点,输出
No: X - Y != 2
,其中X
是后一半数位组成的数,Y
是前一半数位组成的数。
输入样例 1:
233235
输出样例 1:
Yes: 235 - 233 = 2
输入样例 2:
5678912345
输出样例 2:
No: 12345 - 56789 != 2
输入样例 3:
2331235
输出样例 3:
Error: 7 digit(s)
代码
#include <iostream>
using namespace std;
int main()
{
string s;
cin >> s;
if (s.length() % 2)
{
cout << "Error: " << s.length() << " digit(s)";
}
else
{
string s1 = s.substr(0, s.length() / 2), s2 = s.substr(s.length() / 2, s.length() / 2);
// cout << s1 << " " << s2;
if (s1.substr(0, s1.length() - 1) == s2.substr(0, s2.length() - 1) && s1[s.length() - 1] == s2[s.length() - 1] - 2)
{
cout << "Yes: " << s2 << " - " << s1 << " = 2";
}
else if (s1.substr(0, s1.length() - 2) == s2.substr(0, s2.length() - 2) && stoi(s2.substr(s2.length() - 2, 2)) - stoi(s1.substr(s1.length() - 2, 2)) == 2)
{
cout << "Yes: " << s2 << " - " << s1 << " = 2";
}
else
{
cout << "No: " << s2 << " - " << s1 << " != 2";
}
}
return 0;
}
7-2 数字之王 (20分)
给定两个正整数 N1<N2。把从 N1 到 N2 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。
例如 N1=1 和 N2=10 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。
本题就请你对任意给定的 N 1 < N 2 N_1<N_2 N1<N2 求出对应的数字之王。
输入格式:
输入在第一行中给出两个正整数 0 < N 1 < N 2 ≤ 1 0 3 0<N_1<N_2≤10^3 0<N1<N2≤103,其间以空格分隔。
输出格式:
首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入 1 10
就应该在两行中先后输出 6
和 8
。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
10 14
输出样例:
2
0 8
代码
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
long long ans[10];
long long qiuhe(long long x)
{
long long sum = 0;
while (x)
{
sum += x % 10;
x /= 10;
}
return sum;
}
long long qiuhe2(long long x)
{
long long sum = 1;
while (x)
{
sum *= pow(x % 10, 3);
x /= 10;
}
return sum;
}
int main()
{
long long n1, n2, num[1003];
cin >> n1 >> n2;
for (long long i = 1; i <= n2 - n1 + 1; i++)
{
num[i] = n1 - 1 + i;
}
long long f = 0;
for (long long i = 1; i <= n2 - n1 + 1; i++)
{
if (num[i] >= 10)
{
f = 1;
break;
}
}
while (f)
{
for (long long i = 1; i <= n2 - n1 + 1; i++)
{
if (num[i] >= 10)
{
num[i] = qiuhe(qiuhe2(num[i]));
}
else
num[i] = qiuhe(pow(num[i], 3));
}
f = 0;
for (long long i = 1; i <= n2 - n1 + 1; i++)
{
if (num[i] >= 10)
{
f = 1;
break;
}
}
// for (long long i = 1; i <= n2 - n1 + 1; i++)
// {
// cout << num[i] << " ";
// }
// cout << endl;
}
for (long long i = 1; i <= n2 - n1 + 1; i++)
ans[num[i]]++;
vector<long long> p;
long long maxn = -1;
for (long long i = 0; i <= 9; i++)
{
if (ans[i] > maxn)
{
p.clear();
maxn = ans[i];
p.push_back(i);
}
else if (ans[i] == maxn)
{
p.push_back(i);
}
}
cout << maxn << endl;
cout << p[0];
for (long long i = 1; i < p.size(); i++)
{
cout << " " << p[i];
}
return 0;
}
7-3 如需挪车请致电 (20分)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8hpuX6oR-1606038655987)(https://images.ptausercontent.com/f29f986f-a871-4617-8fa7-e0cf4fe1d5d5.jpg)]
上图转自新浪微博。车主用一系列简单计算给出了自己的电话号码,即:
2/2=1、3+2=5、√9=3、√9=3、0%=0、叁=3、5−2=3、9/3=3、1×3=3、23=8、8/2=4,最后得到的电话号码就是 153 3033 3384。
本题就请你写个程序自动完成电话号码的转换,以帮助那些不会计算的人。
输入格式:
输入用 11 行依次给出 11 位数字的计算公式,每个公式占一行。这里仅考虑以下几种运算:加(+
)、减(-
)、乘(*
)、除(/
)、取余(%
,注意这不是上图中的百分比)、开平方根号(sqrt
)、指数(^
)和文字(即 0 到 9 的全小写汉语拼音,如 ling
表示 0)。运算符与运算数之间无空格,运算数保证是不超过 1000 的非负整数。题目保证每个计算至多只有 1 个运算符,结果都是 1 位整数。
输出格式:
在一行中给出电话号码,数字间不要空格。
输入样例:
2/2
3+2
sqrt9
sqrt9
6%2
san
5-2
9/3
1*3
2^3
8/2
输出样例:
15330333384
代码
#include <iostream>
#include <cmath>
using namespace std;
string t[11] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
int check1(string s)
{
for (int i = 0; i <= 9; i++)
{
if (s == t[i])
{
return i;
}
}
return -1;
}
int main()
{
for (int i = 0; i < 11; i++)
{
string s;
cin >> s;
if (check1(s) != -1)
{
cout << check1(s);
}
else
{
if (s[0] == 's')
{
cout << (int)(sqrt(stoi(s.substr(4, s.length() - 4))));
}
else
{
int f = -1;
for (int i = 0; i < s.length(); i++)
{
if (!isdigit(s[i]))
{
f = i;
break;
}
}
if (f == -1)
{
cout << s;
}
else
{
int t1 = stoi(s.substr(0, f)), t2 = stoi(s.substr(f + 1, s.length() - f - 1));
switch (s[f])
{
case '^':
cout << pow(t1, t2);
break;
case '+':
cout << t1 + t2;
break;
case '-':
cout << t1 - t2;
break;
case '*':
cout << t1 * t2;
break;
case '/':
cout << t1 / t2;
break;
case '%':
cout << t1 % t2;
break;
}
}
}
}
}
return 0;
}
7-4 胖达与盆盆奶 (20分)
大熊猫,俗称“胖达”,会排队吃盆盆奶。它们能和谐吃奶的前提,是它们认为盆盆奶的分配是“公平”的,即:更胖的胖达能吃到更多的奶,等胖的胖达得吃到一样多的奶。另一方面,因为它们是排好队的,所以每只胖达只能看到身边胖达的奶有多少,如果觉得不公平就会抢旁边小伙伴的奶吃。
已知一只胖达每次最少要吃 200 毫升的奶,当另一份盆盆奶多出至少 100 毫升的时候,它们才能感觉到是“更多”了,否则没感觉。
现在给定一排胖达的体重,请你帮饲养员计算一下,在保持给定队形的前提下,至少应该准备多少毫升的盆盆奶?
输入格式:
输入首先在第一行给出正整数 n(≤ 1 0 4 10^4 104),为胖达的个数。随后一行给出 n 个正整数,表示 n 只胖达的体重(公斤)。每个数值是不超过 200 的正整数,数字间以空格分隔。
输出格式:
在一行中输出至少应该准备多少毫升的盆盆奶。
输入样例:
10
180 160 100 150 145 142 138 138 138 140
输出样例:
3000
样例解释:
盆盆奶的分配量顺序为:
400 300 200 500 400 300 200 200 200 300
代码
#include <iostream>
using namespace std;
long long kg[10001], a[10001], b[10001];
int main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> kg[i];
}
int t = 0, p = 201;
for (int i = 0; i < n; i++)
{
if (kg[i] > p)
{
t++;
}
else if (kg[i] == p)
{
;
}
else
{
t = 0;
}
a[i] = t;
p = kg[i];
}
t = 0;
p = 202;
for (int i = n - 1; i >= 0; i--)
{
if (kg[i] > p)
{
t++;
}
else if (kg[i] == p)
{
;
}
else
{
t = 0;
}
b[i] = t;
p = kg[i];
}
int ans = 0;
for (int i = 0; i < n; i++)
{
ans = ans + max(a[i], b[i]) * 100 + 200;
}
cout << ans;
return 0;
}
7-5 买地攻略 (25分)
数码城市有土地出售。待售的土地被划分成若干块,每一块标有一个价格。这里假设每块土地只有两块相邻的土地,除了开头和结尾的两块是只有一块邻居的。每位客户可以购买多块连续相邻的土地。
现给定这一系列土地的标价,请你编写程序,根据客户手头的现金量,告诉客户有多少种不同的购买方案。
输入格式:
输入首先在第一行给出两个正整数:N(≤ 1 0 4 10^4 104)为土地分割的块数(于是这些块从 1 到 N 顺次编号);M(≤ 1 0 9 10^9 109)为客户手中的现金量。
随后一行给出 N 个正整数,其中第 i 个数字就是第 i 块土地的标价。
题目保证所有土地的总价不超过 109。
输出格式:
在一行中输出客户有多少种不同的购买方案。请注意客户只能购买连续相邻的土地。
输入样例:
5 85
38 42 15 24 9
输出样例:
11
样例解释:
这 11 种不同的方案为:
38
42
15
24
9
38 42
42 15
42 15 24
15 24
15 24 9
24 9
代码
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int a[10001], dq = 0, ge = 0, ans = 0, yb = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
if (dq + a[i] <= m)
{
ge++;
dq += a[i];
ans += ge;
}
else
{
while (1)
{
dq -= a[yb];
ge--;
++yb;
if (dq + a[i] <= m)
break;
}
ge++;
dq += a[i];
ans += ge;
}
}
cout << ans;
return 0;
}