Happy Number

这篇博客介绍了如何通过将问题转化为三进制数来找出由2,3,6组成(开心数)的第n个数,通过理解进制替换规则,解决了一个看似复杂但实质上是基础数学问题的编程挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Happy Number

题意 :

开心数是由仅由2,3,6组成的,问第n个开心数是哪个?
1<=n<=1e9

题解:

正解应该是:
首先确定k大数有几位:
然后就知道k大数是x位下的第k’大的
把2看成0,3看成1,6看成2
问题就变成三进制数转换

我第一反应其实就是3进制,只不过用2,3,6代替了0,1,2,然后我就直接开始求n的三进制,发现不大对,我手写列举一部分,2,3,6,22,23,26…,22在三进制中是00,23代表的是01,说明这里的三进制应该是:0,1,2,00,01,02,10,11,12…
00挺别扭,我就想分别用1,2,3表示,就是:1,2,3,11,12,13,21,22,23…
第7个数是21,第8个数是22,分别就是7和8的三进制,第9个数的三进制是30,但是我们规定了是1,2,3没有0,所以减一就是23.这样答案就出来了

代码:

// Problem: Happy Number
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11260/H
// Memory Limit: 1048576 MB
// Time Limit: 2000 ms
// Data:2021-08-14 12:11:25
// By Jozky

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
template <typename T> inline void read(T& x)
{
    T f= 1;
    x= 0;
    char ch= getchar();
    while (0 == isdigit(ch)) {
        if (ch == '-')
            f= -1;
        ch= getchar();
    }
    while (0 != isdigit(ch))
        x= (x << 1) + (x << 3) + ch - '0', ch= getchar();
    x*= f;
}
template <typename T> inline void write(T x)
{
    if (x < 0) {
        x= ~(x - 1);
        putchar('-');
    }
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
    startTime= clock();
    freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
    endTime= clock();
    printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 6e6 + 9;
int vec[maxn];
int tot= 0;
void solve(ll n)
{
    while (n) {
        if (n % 3 == 0)
            vec[++tot]= 3, n-= 3;
        else
            vec[++tot]= n % 3;
        n/= 3;
    }

    for (int i= tot; i >= 1; i--) {
        if (vec[i] == 1)
            printf("%d", 2);
        if (vec[i] == 2)
            printf("%d", 3);
        if (vec[i] == 3)
            printf("%d", 6);
    }
}
int main()
{
    //rd_test();
    ll n;
    cin >> n;
    solve(n);
    return 0;
    //Time_test();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值