/*
Problem: hdu Increasing Sequences (1424)
Lang: C++
题意:
给一串数字串给你分割,求分割后(按照递增规律来分割, 即前一个数比后一个数小), 求最后一个数的最小值是多少。
思路:
num[i] 代表的是第i个字符为结尾的串所能求的的最小尾数的第一个数字所在的位置。
设:
a = num[i];
则 str[a]str[a + 1]....str[k]....str[i - 1]str[i]是str[0 ~ i]的最小的尾数
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
//a > b return 1;
//a <= b return 0;
bool Just(char *str, int as, int ae, int bs, int be) {
while(str[as] == '0') as++;
while(str[bs] == '0') bs++;
if(ae - as > be - bs) {
return 1;
} else if(ae - as < be - bs) {
return 0;
}
while(as <= ae) {
if(str[as] > str[bs]) {
return 1;
} else if(str[as] < str[bs]) {
return 0;
}
as++;
bs++;
}
return 0;
}
void Show(char *str, int s, int e) {
int k = s;
while(str[s] == '0' && s < e) s++;
while(s <= e) {
printf("%c", str[s++]);
}
puts("");
}
int main (){
char str[81];
while(scanf("%s", str) != EOF) {
int num[81];
int len = strlen(str);
if(len == 1 && str[0] == '0') {
break;
}
int i, j;
i = 0;
while(str[i] == '0') i++;
memset(num, 0, sizeof(num));
for( ; i < len; i++) {
for(j = i - 1; j >= 0; j--) {
if(Just(str, j + 1, i, num[j], j)) {
break;
}
}
num[i] = j + 1;
}
Show(str, num[len - 1], len - 1);
}
return 0;
}
//简化版
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
int main (){
char str[85];
while(scanf("%s", str) != EOF) {
double num[85];
int len = strlen(str);
if(len == 1 && str[0] == '0') break;
int i, j;
i = 0;
while(str[i] == '0') i++;
memset(num, 0, sizeof(num));
for( ; i < len; i++) {
double key = str[i] - '0';
for(j = i - 1; j >= 0; j--) {
if(key > num[j]) {
break;
}
key += pow(10, i - j + 0.0) * (str[j] - '0');
}
num[i] = key;
}
printf("%.0f\n", num[len - 1]);
}
return 0;
}