拼接两个整数

3
在Fortran中,将两个整数连接成一个整数的最佳方法是什么?
integer a = 999
integer b = 1111

integer c 应该是 9991111

谢谢, SM。

3个回答

8
这里有一个示例代码,可以满足您的需求。它将整数写入字符字符串中,修剪并连接它们,然后从连接的字符字符串中读取结果整数:
integer :: a,b,c
character(len=99) :: char_a,char_b,char_c

a = 999
b = 1111

write(unit=char_a,fmt=*)a
write(unit=char_b,fmt=*)b

char_c = trim(adjustl(char_a))//trim(adjustl(char_b))

read(unit=char_c,fmt=*)c

print*,c

end

编辑:请注意,此示例适用于任何整数长度,假设它们适合其各自的kind(没有整数溢出)。


3

您可以使用数字的顺序信息:

integer :: a = 999
integer :: b = 1111

integer :: c

c = a * 10**(ceiling(log10(real(b)))) + b

write(*,*) c

0

你最好使用内部文件将你的两个整数转换为字符,然后再将其转换回整数。

没有将数字值转换为字符/字符串表示的固有程序。请参阅Fortran Wiki上关于此主题的讨论以获取更多信息(请参见标题为“注意事项”的部分)。

例如,在你的情况下,你可以使用以下方法:

program test_conversion
  implicit none

  integer :: a=999
  integer :: b=1111
  integer :: c

  character(len=7) :: temp

  write(temp, '(i3.3, i4.4)') a, b ! You may need to change these format specifiers

  read(temp, *) c

  print*, c ! This prints 9991111

end program test_conversion

如果您想要不同宽度的整数字符表示,您将需要更改格式字符串。


“write(c, *) temp” 这一行并不是你想象中的那样。它会将 temp 写入一个值为整数 c 的 I/O 单元,而不是写入 c 本身。相反,你需要从 temp 中读取 c。 - milancurcic
那是我的笔误 - 是从上一行复制粘贴的。谢谢你指出来。 - Chris
没问题。只是出于好奇,我尝试了您的代码,使用ifort、pgf90和gfortran编译器。奇怪的是,ifort12似乎将temp写入整数c并打印它,这不是期望/所需的行为。pgf90和gfortran的行为符合预期,生成了fort.gibberish文件作为输出。 - milancurcic
我猜你指的是我之前错误的代码吗?我刚刚在cygwin下尝试了一下使用gfortran编译它,它也将temp写入整数并打印出来,这非常奇怪。 - Chris
1
是的,我指的是之前的代码。虽然我总是喜欢发现编译器中的错误。 - milancurcic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接