高级守护
3819 好玩的数字对折经验值:1200
题目描述 Description
小明在玩过序列对折后,突发奇想,决定自己设计一个数字对折游戏。
对输入的一个整数n,将整数n的从中间对折,方向从左到右,对折后相同位置上的数字会累加到一起。
他想知道对折m次后的整数的样子。
输入描述 Input Description
输入一个整数n,n不超过100,000位,和对折次数m(m<=100)
输出描述 Output Description
输出对折m次后的整数
样例输入 Sample Input
56789 2
样例输出 Sample Output
4211
数据范围及提示 Data Size & Hint
56789第一次折叠后是71414,再一次折叠是4211。
每次折叠后的数字应该是不以0开头的整数
林芳在2020-12-09 21:51:35追加了内容
顶
中级光能
/*
总共处理m次
1.遍历 该字符串
左边折向右边
对于位数是奇数还是偶数 用标志odd处理 奇数的情况ans先存x[n/2]这一位
对应位相加,看到的结果用字符串y存储
对应位相加的结果先用整数存储tmp
在吧整数tmp==0的情况 y不能为空串
字符串连接,最终得到的结果正着存,存到字符串ans
ans首位连续的0要删去
*/
and
核心
string f(string x){
string ans="";
int odd=0,n=x.size();
if(n%2){
odd=1;
ans+=x[n/2];
}
for(int i=n/2+odd;i<n;i++){
string y="";
int tmp=x[i]+x[n-1-i]-'0'-'0';
if(tmp==0){
y="0";
}
else{
while(tmp){
y=char(tmp%10+'0')+y;
tmp/=10;
}
}
ans=ans+y;
}
while(ans[0]=='0'){
ans.erase(0,1);
}
return ans;
}
新手天翼
注释给你
递推要好好学!
特别难!
/*
总处理m次
1.遍历该字符串
左边折向右边
对位数是技术还是偶数 用odd处理 奇数情况ans先存想x[n/2]这一位
对应位相加,得到的结果用字符串y存储
对应位相加的结果先用整数tmp转成字符串y 倒着存
特判:tmp==0的情况y不能为空串
字符串连接,最终得到的结果正这存,存到字符串ans
ans首位连续的0要删去
*/
资深光能
这一题是一道大型的模拟题
算了直接上代码:
string g(int x){
string ans="";
while(x){
ans=char(x%10+'0')+ans;
x/=10;
}
if(ans=="") ans="0";
return ans;
}
string f(string s){
int len=s.size(),t;
string ans="";
for(int i=len/2;i<=len-1;i++){
if(len%2&&i==len/2){
ans+=s[i];
}else{
t=s[i]-'0'+s[len-1-i]-'0';
ans+=g(t);
}
}
while(ans[0]=='0') ans.erase(0,1);
return ans;
}
int main()
{
cin>>s>>m;
if(s=="0"){
cout<<0;
return 0;
}
while(m--){
s=f(s);
}
cout<<s;
抄代码固然可耻,建议手打,不要复制