You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:15:24