【题目描述】
自从洋葱妹学了数据结构,见识过了立体而丰满的二叉树,她感到是越看那些扁平的数字,越觉得面目可憎。于是洋葱妹决定重新定义自然数,她宣布,自然数从今以后改名叫二叉数!
例如: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;
}