计蒜客:二叉数

【题目描述】

自从洋葱妹学了数据结构,见识过了立体而丰满的二叉树,她感到是越看那些扁平的数字,越觉得面目可憎。于是洋葱妹决定重新定义自然数,她宣布,自然数从今以后改名叫二叉数!

例如:11345根节点值为3,左子数为11,右子数为45。而5432的根节点值为空,左子数为54,右子树为32。

看着自己定义的美妙结构,洋葱妹心满意足。忽然,她高度抽象的脑子里灵光一闪:自己能不能把自然数分为10个大类呢?为了达到这一目的,洋葱妹定义了一个运算,能够把所有二叉数映射到0到9:

        1.对于偶数位数的数 A,得到一个新数,新数为A的左子数加上右子数;                                           2 .对于奇数位数的数 B,得到一个新数,新数为B的左子数乘上右子数 ;                                         3.若新数大于9,则重复运算;

例如:

11345 →(11*45=495)→(4*5=20)→(2+0=2)

于是11345转化为了2。

【输入格式】

输入有一行,第一行一个正整数 n(n≤2^30),表示最初的数字。

【输出格式】

输出一个数字a,表示给n最终转化成的自然数。

【样例输入】

114219631

【样例输出】

8

【解析】

这题的难点主要是n的类型,和类型转换。

【C++代码】

#include<bits/stdc++.h>
using namespace std;
void f(string n){
    int len=n.size();//字符串长度
    if(len<=1){
        cout<<n;//输出
        return;//不要漏
    }
    if(len%2==0){
        long long s=stol(n.substr(0,len/2),0,10);//字符串转长整型
        long long s1=stol(n.substr(len/2,len/2),0,10);//字符串转长整型
        f(to_string(s+s1));//记得转回去
        return;//不要漏
    }else{
        long long s=stol(n.substr(0,len/2),0,10);//字符串转长整型
        long long s1=stol(n.substr(len/2+1,len/2),0,10);//字符串转长整型
        f(to_string(s*s1));//记得转回去
        return;//不要漏
    }
}
int main() {
    string n;
    cin>>n;
    f(n);
    return 0;
}

  • 19
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值