如何编写Fortran子程序从整数输入中提取指定位数数字
Fortran提取整数指定位数的实现方案
原代码问题梳理
- 子程序未正确接收输入整数
num,也未定义输出参数的传递逻辑 - 调用子程序时参数传递错误,无法将输入数传递给子程序并获取结果
- 未实现提取指定位数的核心逻辑
方案一:数学运算实现(推荐)
利用整数除法和取模运算直接提取指定位数,逻辑简洁高效:
PROGRAM DATING IMPLICIT NONE INTEGER :: num, first, second, fourth, sixth ! 变量声明 WRITE(*,*) 'What number did prison Ex give you? ' READ(*,*) num ! 调用子程序提取对应位数 CALL FIRST(num, first) CALL SECOND(num, second) CALL FOURTH(num, fourth) CALL SIXTH(num, sixth) ! 输出结果 WRITE(*,*) '从右数第1位数字:', first WRITE(*,*) '从右数第2位数字:', second WRITE(*,*) '从右数第4位数字:', fourth WRITE(*,*) '从右数第6位数字:', sixth END PROGRAM DATING ! 提取从右数第1位 SUBROUTINE FIRST(input_num, result) IMPLICIT NONE INTEGER, INTENT(IN) :: input_num ! 输入整数 INTEGER, INTENT(OUT) :: result ! 输出结果 result = MOD(input_num, 10) ! 取模10得到最后一位 RETURN END SUBROUTINE FIRST ! 提取从右数第2位 SUBROUTINE SECOND(input_num, result) IMPLICIT NONE INTEGER, INTENT(IN) :: input_num INTEGER, INTENT(OUT) :: result result = MOD(input_num / 10, 10) ! 先除以10去掉最后一位,再取模10 RETURN END SUBROUTINE SECOND ! 提取从右数第4位 SUBROUTINE FOURTH(input_num, result) IMPLICIT NONE INTEGER, INTENT(IN) :: input_num INTEGER, INTENT(OUT) :: result result = MOD(input_num / 1000, 10) ! 除以10^3去掉最后3位,再取模10 RETURN END SUBROUTINE FOURTH ! 提取从右数第6位 SUBROUTINE SIXTH(input_num, result) IMPLICIT NONE INTEGER, INTENT(IN) :: input_num INTEGER, INTENT(OUT) :: result result = MOD(input_num / 100000, 10)! 除以10^5去掉最后5位,再取模10 RETURN END SUBROUTINE SIXTH
核心逻辑
- 整数除法
input_num / 10^(n-1):去掉数字的最后n-1位,保留前几位 - 取模运算
MOD(...,10):获取当前最右侧的数字(即原数从右数第n位) - 示例:输入123456时,第4位计算为
123456/1000=123,123 mod10=3,符合需求
方案二:字符串转换实现
适合需要灵活定位位数的场景,通过字符串索引直接提取:
PROGRAM DATING IMPLICIT NONE INTEGER :: num, first, second, fourth, sixth CHARACTER(LEN=10) :: num_str ! 存储转换后的字符串 WRITE(*,*) 'What number did prison Ex give you? ' READ(*,*) num ! 将整数转换为字符串并去除前导空格 WRITE(num_str, '(I10)') num num_str = ADJUSTL(num_str) CALL FIRST_STR(num_str, first) CALL SECOND_STR(num_str, second) CALL FOURTH_STR(num_str, fourth) CALL SIXTH_STR(num_str, sixth) WRITE(*,*) '从右数第1位数字:', first WRITE(*,*) '从右数第2位数字:', second WRITE(*,*) '从右数第4位数字:', fourth WRITE(*,*) '从右数第6位数字:', sixth END PROGRAM DATING ! 字符串法提取第1位 SUBROUTINE FIRST_STR(num_str, result) IMPLICIT NONE CHARACTER(LEN=*), INTENT(IN) :: num_str INTEGER, INTENT(OUT) :: result ! 取字符串最后一个字符并转换为整数 READ(num_str(LEN_TRIM(num_str):LEN_TRIM(num_str)), '(I1)') result RETURN END SUBROUTINE FIRST_STR ! 字符串法提取第2位 SUBROUTINE SECOND_STR(num_str, result) IMPLICIT NONE CHARACTER(LEN=*), INTENT(IN) :: num_str INTEGER, INTENT(OUT) :: result INTEGER :: str_len str_len = LEN_TRIM(num_str) ! 取倒数第二个字符 READ(num_str(str_len-1:str_len-1), '(I1)') result RETURN END SUBROUTINE SECOND_STR ! 字符串法提取第4位 SUBROUTINE FOURTH_STR(num_str, result) IMPLICIT NONE CHARACTER(LEN=*), INTENT(IN) :: num_str INTEGER, INTENT(OUT) :: result INTEGER :: str_len str_len = LEN_TRIM(num_str) ! 取倒数第4个字符 READ(num_str(str_len-3:str_len-3), '(I1)') result RETURN END SUBROUTINE FOURTH_STR ! 字符串法提取第6位 SUBROUTINE SIXTH_STR(num_str, result) IMPLICIT NONE CHARACTER(LEN=*), INTENT(IN) :: num_str INTEGER, INTENT(OUT) :: result INTEGER :: str_len str_len = LEN_TRIM(num_str) ! 取倒数第6个字符 READ(num_str(str_len-5:str_len-5), '(I1)') result RETURN END SUBROUTINE SIXTH_STR
核心逻辑
- 将整数转换为字符串后,通过
LEN_TRIM获取有效长度 - 从字符串末尾倒数对应位置提取字符,再转换为整数
- 若输入数字不足6位,需额外添加长度判断避免数组越界
注意事项
- 子程序必须明确
INTENT(IN)(输入参数)和INTENT(OUT)(输出参数),确保参数传递方向正确 - 原代码中
WRITE(output,'(i2.2)')num的格式符仅支持两位数字,若输入6位数字会报错,需根据实际需求调整格式 - 数学方法在输入数字不足指定位数时会返回0,字符串方法需手动处理边界情况
内容的提问来源于stack exchange,提问作者Cole S
相关产品推荐
相关产品推荐

