【正经题解】3n±1 hard
2024-03-18 14:39:37
发布于:浙江
6阅读
0回复
0点赞
使用一个循环,当 不等于 时,进行操作。
在每次循环中,计算当前数字的各位数之和 。
根据 对 取余,分情况进行操作:
如果 % ,说明当前数字可以被 整除,执行除以 的操作。
如果 % ,说明当前数字除以 余 ,执行减 的操作。
如果 % ,说明当前数字除以 余 ,执行加 的操作。
每执行一次操作,增加操作次数 。
循环终止条件为 等于 。
输出 ,即为最少的操作次数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>
inline void rd(T &x) {
x = 0;
char c = getchar();
bool f = 0;
while (!isdigit(c)) {
if (c == '-') {
f = 1;
}
c = getchar();
}
while (isdigit(c)) {
x = (x << 3) + (x << 1) + (c ^ '0');
c = getchar();
}
if (f) {
x = ~(x - 1);
}
}
template<typename T, typename...Args>
inline void rd(T &x, Args&...args) {
rd(x);
rd(args...);
}
inline void wt(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) {
wt(x / 10);
}
putchar(x % 10 + '0');
}
inline void wtl(int x) {
wt(x);
putchar('\n');
}
#define pc(x) putchar(x)
#define wtl(x) wt(x), pc('\n')
#define kg pc(' ')
#define hh pc('\n')
#define lb(x) x&-x
int a[10010], b[10010], c[10010];
inline void init() {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
}
inline string chu(string a1, int b) {
init();
int lena = a1.size();
for (int i = 0; i < lena; i++) {
a[i] = a1[i] - '0';
}
long long r = 0, cnt = 0;
for (int i = 0; i < lena; i++) {
r = r * 10 + a[i];
cnt++;
c[cnt] = 0;
if (r >= b) {
c[cnt] = r / b;
r %= b;
}
}
int i = 0;
while (c[i] == 0 && (cnt - i) > 0) {
i++;
}
string s;
for (; i <= cnt; i++) {
s += c[i] + '0';
}
return s;
}
inline string jia(string a1, string b1) {
init();
int lena = a1.size();
int lenb = b1.size();
for (int i = 0; i < lena; i++) {
a[i] = a1[lena - 1 - i] - '0';
}
for (int i = 0; i < lenb; i++) {
b[i] = b1[lenb - 1 - i] - '0';
}
int lenc = max(lena, lenb), t = 0;
for (int i = 0; i < lenc; i++) {
c[i] = a[i] + b[i] + t;
if (c[i] >= 10) {
t = 1;
c[i] %= 10;
} else {
t = 0;
}
}
if (t == 1) {
lenc++;
c[lenc - 1] = 1;
}
string s;
for (int i = lenc - 1; i >= 0; i--) {
s += c[i] + '0';
}
return s;
}
inline string jian(string a1, string b1) {
init();
int lena = a1.size();
int lenb = b1.size();
for (int i = 0; i < lena; i++) {
a[i] = a1[lena - 1 - i] - '0';
}
for (int i = 0; i < lenb; i++) {
b[i] = b1[lenb - 1 - i] - '0';
}
int lenc = lena;
for (int i = 0; i < lenc; i++) {
if (a[i] < b[i]) {
a[i + 1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
while (lenc >= 1 && c[lenc - 1] == 0) {
lenc--;
}
string s;
for (int i = lenc - 1; i >= 0; i--) {
s += c[i] + '0';
}
return s;
}
signed main() {
string s;
cin >> s;
int ans = 0;
while (s != "1") {
if (s == "0" || s == "2") {
ans++;
break;
}
int sum = 0;
for (int i = 0; i < s.size(); i++) {
sum += (s[i] - '0');
}
if (sum % 3 == 0) {
s = chu(s, 3);
} else if (sum % 3 == 1) {
s = jian(s, "1");
} else {
s = jia(s, "1");
}
ans++;
}
wtl(ans);
return 0;
}
这里空空如也
有帮助,赞一个