字符串加法(判断序列号是否连续)
来源:互联网 发布:js获取数组前几个元素 编辑:程序博客网 时间:2024/06/07 21:07
字符串不能整体做加法 但是我们可以模拟加法
字符集就是 0 1 2 3 4 5 6 7 8 9 A B C D E F G …… Z (按顺序排列)
你可以认为这是一个35进制的数字
然后在最后1位+1 如果不是Z 就得到后一位数字
(比如 2 + 1 = 3,9 + 1 = A ,X + 1 = Y,Y + 1 = Z 我相信你们要求的相邻也是这样的顺序)
如果最后一位是Z , 那+1就等于 0了, 往前1位加一 (做进位)
规则也是这样的,把进位做完了以后,这个字符串的+1操作就结束了。
字符集就是 0 1 2 3 4 5 6 7 8 9 A B C D E F G …… Z (按顺序排列)
你可以认为这是一个35进制的数字
然后在最后1位+1 如果不是Z 就得到后一位数字
(比如 2 + 1 = 3,9 + 1 = A ,X + 1 = Y,Y + 1 = Z 我相信你们要求的相邻也是这样的顺序)
如果最后一位是Z , 那+1就等于 0了, 往前1位加一 (做进位)
规则也是这样的,把进位做完了以后,这个字符串的+1操作就结束了。
*&---------------------------------------------------------------------*
*& Report ZIAN01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zian01.
TYPE-POOLS:slis.
PERFORM getdata.
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getdata.
DATA:BEGIN OF line,
sernr LIKE objk-sernr,
END OF line.
DATA:itab LIKE TABLE OF line WITH HEADER LINE.
line-sernr = '12348'.
APPEND line TO itab.
line-sernr = '12350'.
APPEND line TO itab.
line-sernr = '12351'.
APPEND line TO itab.
line-sernr = '12352'.
APPEND line TO itab.
line-sernr = '12356'.
APPEND line TO itab.
line-sernr = '12357'.
APPEND line TO itab.
line-sernr = '12358'.
APPEND line TO itab.
line-sernr = '12360'.
APPEND line TO itab.
line-sernr = '12361'.
APPEND line TO itab.
DATA:s_sernr TYPE string.
DATA:n1 TYPE i.
n1 = 0.
*& Report ZIAN01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zian01.
TYPE-POOLS:slis.
PERFORM getdata.
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getdata.
DATA:BEGIN OF line,
sernr LIKE objk-sernr,
END OF line.
DATA:itab LIKE TABLE OF line WITH HEADER LINE.
line-sernr = '12348'.
APPEND line TO itab.
line-sernr = '12350'.
APPEND line TO itab.
line-sernr = '12351'.
APPEND line TO itab.
line-sernr = '12352'.
APPEND line TO itab.
line-sernr = '12356'.
APPEND line TO itab.
line-sernr = '12357'.
APPEND line TO itab.
line-sernr = '12358'.
APPEND line TO itab.
line-sernr = '12360'.
APPEND line TO itab.
line-sernr = '12361'.
APPEND line TO itab.
DATA:s_sernr TYPE string.
DATA:n1 TYPE i.
n1 = 0.
sort itab by sernr.
LOOP AT itab.
DATA: i TYPE i, len TYPE i.
DATA: s_forward TYPE i.
i = 1.
len = 0.
s_forward = 1.
DATA:serialitem TYPE string.
DATA:nextserial TYPE string.
DATA:flag TYPE i.
flag = 0.
serialitem = itab-sernr.
DATA: s1 TYPE string, s2 TYPE string.
DATA: itablen TYPE i.
itablen = lines( itab ).
IF itablen = 1.
s_sernr = serialitem. "只有一条序列号
ENDIF.
IF itablen > 1. "有多个序列号
IF n1 = 1 AND serialitem = nextserial. "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号相等
s1 = s2.
ENDIF.
IF n1 = 1 AND serialitem <> nextserial. "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号不相等
s1 = serialitem.
CONCATENATE s_sernr s2 INTO s_sernr.
ENDIF.
IF n1 > 1 AND serialitem <> nextserial AND n1 <> itablen - 1. "循环到第二个序列号后面的序列号,并且当前序列号和上个序列号算出来的下个序列号不等并且不是最后一个序列号
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr.
s1 = serialitem.
ENDIF.
IF n1 = itablen - 1 AND serialitem = nextserial."如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号相等
s2 = serialitem.
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr.
ENDIF.
IF n1 = itablen - 1 AND serialitem <> nextserial."如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号不相等
CONCATENATE s_sernr ',' s1 '-' s2 ',' serialitem INTO s_sernr.
ENDIF.
ENDIF.
"判断字符串是不是全是‘Z'',如果全是'Z'进位1
len = strlen( serialitem ).
DATA:zflag TYPE i, t TYPE i, zchar TYPE c.
DATA: zstring TYPE string.
zstring = ''.
zflag = 0.
t = 0.
WHILE t < len.
zchar = serialitem+t(1).
CONCATENATE zstring 'Z' INTO zstring.
t = t + 1.
ENDWHILE.
IF zstring = serialitem. "如果字符串是全'Z',则进位1,后补0
t = 0.
zstring = '1'.
WHILE t < len.
CONCATENATE zstring '0' INTO zstring.
t = t + 1.
ENDWHILE.
nextserial = zstring.
ENDIF.
WHILE i <= len AND s_forward = 1.
DATA:strstart TYPE string, strmid TYPE string, strend TYPE string.
DATA:endchar TYPE c.
DATA:point TYPE i, p1 TYPE i, n TYPE i.
point = len - i.
p1 = point + 1.
n = i - 1.
endchar = serialitem+point(1).
IF endchar <> 'Z'. "如果字符不为’Z‘’
s_forward = 0. "s_forward为0则不进行while循环了
strstart = serialitem+0(point).
IF flag = 0. "flag为0表示不需要进位加 1
strend = serialitem+p1(n).
CASE endchar.
WHEN '0'.
CONCATENATE strstart '1' strend INTO nextserial.
WHEN '1'.
CONCATENATE strstart '2' strend INTO nextserial.
WHEN '2'.
CONCATENATE strstart '3' strend INTO nextserial.
WHEN '3'.
CONCATENATE strstart '4' strend INTO nextserial.
WHEN '4'.
CONCATENATE strstart '5' strend INTO nextserial.
WHEN '5'.
CONCATENATE strstart '6' strend INTO nextserial.
WHEN '6'.
CONCATENATE strstart '7' strend INTO nextserial.
WHEN '7'.
CONCATENATE strstart '8' strend INTO nextserial.
WHEN '8'.
CONCATENATE strstart '9' strend INTO nextserial.
WHEN '9'.
CONCATENATE strstart 'A' strend INTO nextserial.
WHEN 'A'.
CONCATENATE strstart 'B' strend INTO nextserial.
WHEN 'B'.
CONCATENATE strstart 'C' strend INTO nextserial.
WHEN 'C'.
CONCATENATE strstart 'D' strend INTO nextserial.
WHEN 'D'.
CONCATENATE strstart 'E' strend INTO nextserial.
WHEN 'E'.
CONCATENATE strstart 'F' strend INTO nextserial.
WHEN 'F'.
CONCATENATE strstart 'G' strend INTO nextserial.
WHEN 'G'.
CONCATENATE strstart 'H' strend INTO nextserial.
WHEN 'H'.
CONCATENATE strstart 'I' strend INTO nextserial.
WHEN 'I'.
CONCATENATE strstart 'J' strend INTO nextserial.
WHEN 'J'.
CONCATENATE strstart 'K' strend INTO nextserial.
WHEN 'K'.
CONCATENATE strstart 'L' strend INTO nextserial.
WHEN 'L'.
CONCATENATE strstart 'M' strend INTO nextserial.
WHEN 'M'.
CONCATENATE strstart 'N' strend INTO nextserial.
WHEN 'N'.
CONCATENATE strstart 'O' strend INTO nextserial.
WHEN 'O'.
CONCATENATE strstart 'P' strend INTO nextserial.
WHEN 'P'.
CONCATENATE strstart 'Q' strend INTO nextserial.
WHEN 'Q'.
CONCATENATE strstart 'R' strend INTO nextserial.
WHEN 'R'.
CONCATENATE strstart 'S' strend INTO nextserial.
WHEN 'S'.
CONCATENATE strstart 'T' strend INTO nextserial.
WHEN 'T'.
CONCATENATE strstart 'U' strend INTO nextserial.
WHEN 'U'.
CONCATENATE strstart 'V' strend INTO nextserial.
WHEN 'V'.
CONCATENATE strstart 'W' strend INTO nextserial.
WHEN 'W'.
CONCATENATE strstart 'X' strend INTO nextserial.
WHEN 'X'.
CONCATENATE strstart 'Y' strend INTO nextserial.
WHEN 'Y'.
CONCATENATE strstart 'Z' strend INTO nextserial.
ENDCASE.
ELSE. "flag为 1 需要进位加 1 ,如123Z 进位变为1240
DATA:m TYPE i.
m = 0.
WHILE m < i - 1.
CONCATENATE strend '0' INTO strend.
m = m + 1.
ENDWHILE.
CASE endchar.
WHEN '0'.
CONCATENATE strstart '1' strend INTO nextserial.
WHEN '1'.
CONCATENATE strstart '2' strend INTO nextserial.
WHEN '2'.
CONCATENATE strstart '3' strend INTO nextserial.
WHEN '3'.
CONCATENATE strstart '4' strend INTO nextserial.
WHEN '4'.
CONCATENATE strstart '5' strend INTO nextserial.
WHEN '5'.
CONCATENATE strstart '6' strend INTO nextserial.
WHEN '6'.
CONCATENATE strstart '7' strend INTO nextserial.
WHEN '7'.
CONCATENATE strstart '8' strend INTO nextserial.
WHEN '8'.
CONCATENATE strstart '9' strend INTO nextserial.
WHEN '9'.
CONCATENATE strstart 'A' strend INTO nextserial.
WHEN 'A'.
CONCATENATE strstart 'B' strend INTO nextserial.
WHEN 'B'.
CONCATENATE strstart 'C' strend INTO nextserial.
WHEN 'C'.
CONCATENATE strstart 'D' strend INTO nextserial.
WHEN 'D'.
CONCATENATE strstart 'E' strend INTO nextserial.
WHEN 'E'.
CONCATENATE strstart 'F' strend INTO nextserial.
WHEN 'F'.
CONCATENATE strstart 'G' strend INTO nextserial.
WHEN 'G'.
CONCATENATE strstart 'H' strend INTO nextserial.
WHEN 'H'.
CONCATENATE strstart 'I' strend INTO nextserial.
WHEN 'I'.
CONCATENATE strstart 'J' strend INTO nextserial.
WHEN 'J'.
CONCATENATE strstart 'K' strend INTO nextserial.
WHEN 'K'.
CONCATENATE strstart 'L' strend INTO nextserial.
WHEN 'L'.
CONCATENATE strstart 'M' strend INTO nextserial.
WHEN 'M'.
CONCATENATE strstart 'N' strend INTO nextserial.
WHEN 'N'.
CONCATENATE strstart 'O' strend INTO nextserial.
WHEN 'O'.
CONCATENATE strstart 'P' strend INTO nextserial.
WHEN 'P'.
CONCATENATE strstart 'Q' strend INTO nextserial.
WHEN 'Q'.
CONCATENATE strstart 'R' strend INTO nextserial.
WHEN 'R'.
CONCATENATE strstart 'S' strend INTO nextserial.
WHEN 'S'.
CONCATENATE strstart 'T' strend INTO nextserial.
WHEN 'T'.
CONCATENATE strstart 'U' strend INTO nextserial.
WHEN 'U'.
CONCATENATE strstart 'V' strend INTO nextserial.
WHEN 'V'.
CONCATENATE strstart 'W' strend INTO nextserial.
WHEN 'W'.
CONCATENATE strstart 'X' strend INTO nextserial.
WHEN 'X'.
CONCATENATE strstart 'Y' strend INTO nextserial.
WHEN 'Y'.
CONCATENATE strstart 'Z' strend INTO nextserial.
ENDCASE.
ENDIF.
ELSE.
s_forward = 1. "有 'Z''字符需要查找前一个字符
flag = 1.
ENDIF.
i = i + 1.
ENDWHILE.
s2 = serialitem.
n1 = n1 + 1.
ENDLOOP.
SHIFT s_sernr LEFT DELETING LEADING ','.
WRITE:'s_sernr' ,s_sernr.
ENDFORM. "getdata*&---------------------------------------------------------------------*
LOOP AT itab.
DATA: i TYPE i, len TYPE i.
DATA: s_forward TYPE i.
i = 1.
len = 0.
s_forward = 1.
DATA:serialitem TYPE string.
DATA:nextserial TYPE string.
DATA:flag TYPE i.
flag = 0.
serialitem = itab-sernr.
DATA: s1 TYPE string, s2 TYPE string.
DATA: itablen TYPE i.
itablen = lines( itab ).
IF itablen = 1.
s_sernr = serialitem. "只有一条序列号
ENDIF.
IF itablen > 1. "有多个序列号
IF n1 = 1 AND serialitem = nextserial. "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号相等
s1 = s2.
ENDIF.
IF n1 = 1 AND serialitem <> nextserial. "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号不相等
s1 = serialitem.
CONCATENATE s_sernr s2 INTO s_sernr.
ENDIF.
IF n1 > 1 AND serialitem <> nextserial AND n1 <> itablen - 1. "循环到第二个序列号后面的序列号,并且当前序列号和上个序列号算出来的下个序列号不等并且不是最后一个序列号
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr.
s1 = serialitem.
ENDIF.
IF n1 = itablen - 1 AND serialitem = nextserial."如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号相等
s2 = serialitem.
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr.
ENDIF.
IF n1 = itablen - 1 AND serialitem <> nextserial."如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号不相等
CONCATENATE s_sernr ',' s1 '-' s2 ',' serialitem INTO s_sernr.
ENDIF.
ENDIF.
"判断字符串是不是全是‘Z'',如果全是'Z'进位1
len = strlen( serialitem ).
DATA:zflag TYPE i, t TYPE i, zchar TYPE c.
DATA: zstring TYPE string.
zstring = ''.
zflag = 0.
t = 0.
WHILE t < len.
zchar = serialitem+t(1).
CONCATENATE zstring 'Z' INTO zstring.
t = t + 1.
ENDWHILE.
IF zstring = serialitem. "如果字符串是全'Z',则进位1,后补0
t = 0.
zstring = '1'.
WHILE t < len.
CONCATENATE zstring '0' INTO zstring.
t = t + 1.
ENDWHILE.
nextserial = zstring.
ENDIF.
WHILE i <= len AND s_forward = 1.
DATA:strstart TYPE string, strmid TYPE string, strend TYPE string.
DATA:endchar TYPE c.
DATA:point TYPE i, p1 TYPE i, n TYPE i.
point = len - i.
p1 = point + 1.
n = i - 1.
endchar = serialitem+point(1).
IF endchar <> 'Z'. "如果字符不为’Z‘’
s_forward = 0. "s_forward为0则不进行while循环了
strstart = serialitem+0(point).
IF flag = 0. "flag为0表示不需要进位加 1
strend = serialitem+p1(n).
CASE endchar.
WHEN '0'.
CONCATENATE strstart '1' strend INTO nextserial.
WHEN '1'.
CONCATENATE strstart '2' strend INTO nextserial.
WHEN '2'.
CONCATENATE strstart '3' strend INTO nextserial.
WHEN '3'.
CONCATENATE strstart '4' strend INTO nextserial.
WHEN '4'.
CONCATENATE strstart '5' strend INTO nextserial.
WHEN '5'.
CONCATENATE strstart '6' strend INTO nextserial.
WHEN '6'.
CONCATENATE strstart '7' strend INTO nextserial.
WHEN '7'.
CONCATENATE strstart '8' strend INTO nextserial.
WHEN '8'.
CONCATENATE strstart '9' strend INTO nextserial.
WHEN '9'.
CONCATENATE strstart 'A' strend INTO nextserial.
WHEN 'A'.
CONCATENATE strstart 'B' strend INTO nextserial.
WHEN 'B'.
CONCATENATE strstart 'C' strend INTO nextserial.
WHEN 'C'.
CONCATENATE strstart 'D' strend INTO nextserial.
WHEN 'D'.
CONCATENATE strstart 'E' strend INTO nextserial.
WHEN 'E'.
CONCATENATE strstart 'F' strend INTO nextserial.
WHEN 'F'.
CONCATENATE strstart 'G' strend INTO nextserial.
WHEN 'G'.
CONCATENATE strstart 'H' strend INTO nextserial.
WHEN 'H'.
CONCATENATE strstart 'I' strend INTO nextserial.
WHEN 'I'.
CONCATENATE strstart 'J' strend INTO nextserial.
WHEN 'J'.
CONCATENATE strstart 'K' strend INTO nextserial.
WHEN 'K'.
CONCATENATE strstart 'L' strend INTO nextserial.
WHEN 'L'.
CONCATENATE strstart 'M' strend INTO nextserial.
WHEN 'M'.
CONCATENATE strstart 'N' strend INTO nextserial.
WHEN 'N'.
CONCATENATE strstart 'O' strend INTO nextserial.
WHEN 'O'.
CONCATENATE strstart 'P' strend INTO nextserial.
WHEN 'P'.
CONCATENATE strstart 'Q' strend INTO nextserial.
WHEN 'Q'.
CONCATENATE strstart 'R' strend INTO nextserial.
WHEN 'R'.
CONCATENATE strstart 'S' strend INTO nextserial.
WHEN 'S'.
CONCATENATE strstart 'T' strend INTO nextserial.
WHEN 'T'.
CONCATENATE strstart 'U' strend INTO nextserial.
WHEN 'U'.
CONCATENATE strstart 'V' strend INTO nextserial.
WHEN 'V'.
CONCATENATE strstart 'W' strend INTO nextserial.
WHEN 'W'.
CONCATENATE strstart 'X' strend INTO nextserial.
WHEN 'X'.
CONCATENATE strstart 'Y' strend INTO nextserial.
WHEN 'Y'.
CONCATENATE strstart 'Z' strend INTO nextserial.
ENDCASE.
ELSE. "flag为 1 需要进位加 1 ,如123Z 进位变为1240
DATA:m TYPE i.
m = 0.
WHILE m < i - 1.
CONCATENATE strend '0' INTO strend.
m = m + 1.
ENDWHILE.
CASE endchar.
WHEN '0'.
CONCATENATE strstart '1' strend INTO nextserial.
WHEN '1'.
CONCATENATE strstart '2' strend INTO nextserial.
WHEN '2'.
CONCATENATE strstart '3' strend INTO nextserial.
WHEN '3'.
CONCATENATE strstart '4' strend INTO nextserial.
WHEN '4'.
CONCATENATE strstart '5' strend INTO nextserial.
WHEN '5'.
CONCATENATE strstart '6' strend INTO nextserial.
WHEN '6'.
CONCATENATE strstart '7' strend INTO nextserial.
WHEN '7'.
CONCATENATE strstart '8' strend INTO nextserial.
WHEN '8'.
CONCATENATE strstart '9' strend INTO nextserial.
WHEN '9'.
CONCATENATE strstart 'A' strend INTO nextserial.
WHEN 'A'.
CONCATENATE strstart 'B' strend INTO nextserial.
WHEN 'B'.
CONCATENATE strstart 'C' strend INTO nextserial.
WHEN 'C'.
CONCATENATE strstart 'D' strend INTO nextserial.
WHEN 'D'.
CONCATENATE strstart 'E' strend INTO nextserial.
WHEN 'E'.
CONCATENATE strstart 'F' strend INTO nextserial.
WHEN 'F'.
CONCATENATE strstart 'G' strend INTO nextserial.
WHEN 'G'.
CONCATENATE strstart 'H' strend INTO nextserial.
WHEN 'H'.
CONCATENATE strstart 'I' strend INTO nextserial.
WHEN 'I'.
CONCATENATE strstart 'J' strend INTO nextserial.
WHEN 'J'.
CONCATENATE strstart 'K' strend INTO nextserial.
WHEN 'K'.
CONCATENATE strstart 'L' strend INTO nextserial.
WHEN 'L'.
CONCATENATE strstart 'M' strend INTO nextserial.
WHEN 'M'.
CONCATENATE strstart 'N' strend INTO nextserial.
WHEN 'N'.
CONCATENATE strstart 'O' strend INTO nextserial.
WHEN 'O'.
CONCATENATE strstart 'P' strend INTO nextserial.
WHEN 'P'.
CONCATENATE strstart 'Q' strend INTO nextserial.
WHEN 'Q'.
CONCATENATE strstart 'R' strend INTO nextserial.
WHEN 'R'.
CONCATENATE strstart 'S' strend INTO nextserial.
WHEN 'S'.
CONCATENATE strstart 'T' strend INTO nextserial.
WHEN 'T'.
CONCATENATE strstart 'U' strend INTO nextserial.
WHEN 'U'.
CONCATENATE strstart 'V' strend INTO nextserial.
WHEN 'V'.
CONCATENATE strstart 'W' strend INTO nextserial.
WHEN 'W'.
CONCATENATE strstart 'X' strend INTO nextserial.
WHEN 'X'.
CONCATENATE strstart 'Y' strend INTO nextserial.
WHEN 'Y'.
CONCATENATE strstart 'Z' strend INTO nextserial.
ENDCASE.
ENDIF.
ELSE.
s_forward = 1. "有 'Z''字符需要查找前一个字符
flag = 1.
ENDIF.
i = i + 1.
ENDWHILE.
s2 = serialitem.
n1 = n1 + 1.
ENDLOOP.
SHIFT s_sernr LEFT DELETING LEADING ','.
WRITE:'s_sernr' ,s_sernr.
ENDFORM. "getdata*&---------------------------------------------------------------------*
- 字符串加法(判断序列号是否连续)
- 判断字符串中的数字是否相同,连续
- 提取字符串中的数据,判断数字是否为连续递增
- 判断月份集合是否连续
- 判断字符串中是否包含连续相同的字符串(密码规范)
- 判断字符串内是否又连续出现n次的方法
- 判断是否为连续的数字拼接而成的字符串
- 判断字符串是否对称
- 判断字符串是否回文
- 判断字符串是否对称
- 判断字符串是否对称
- 判断字符串是否对称
- 判断是否是字符串
- 判断字符串是否回文
- 判断字符串是否对称
- 判断字符串是否回文
- 判断是否为字符串
- 判断字符串是否对称
- CV_MAT_ELEM——获取矩阵元素和初始化矩阵
- Windows手工创建服务方法
- 54.windbg-a、.dvalloc (直接写反汇编和new内存,实例:加入附加的printf)
- type="button"和type="submit"的区别
- POJ 2001 Shortest Prefixes
- 字符串加法(判断序列号是否连续)
- 一个窗口显示多个视频子窗口
- Twitter Storm源代码分析之ZooKeeper中的目录结构
- socket的实现方式
- Mac如何卸载干净文件
- jni下字符转换编码
- fmt标签
- 背影繁荣,今时回忆
- 【小编教你如何解析Windows XP注册表的常用设置技巧】