Fortran Coder

数据排列组合 求一算法

查看数: 13927 | 评论数: 10 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2015-2-4 22:20

正文摘要:

本帖最后由 yccpp 于 2015-2-4 22:50 编辑 本人想用fortran进行数据的重新排列组合,向大神求一算法。原始数据是多行两列的数据,想把有公共数据的行写成一行且公共数据只出现一次。关键是公共数据不是固定的,下 ...

回复

fcode 发表于 2015-2-22 22:28:50
用我的代码执行后,输出为 2 行:
33035 40381 44096 40374 48872
38659 44165 53155

你能说说为什么要写成1行吗?
yccpp 发表于 2015-2-22 19:11:10
谢谢fcode,下面是从我的附件中摘取的一组应该写在一起的数据,他们在number文件中的形式是
33035    40381
33035    44096
38659    44165
40374    40381
40381    48872
44165    53155
48872    53155
48872    54478
48872    56608
53155    60902
54478    56608
54478    60902
每一组数据中都有一个数据与另外至少一组数据中的一个数据相同,则把这些数据写在一起,输出后的形式为
33035        38659        40374        40381        44096        44165        48872        53155        54478        56608        60902
谢谢。
fcode 发表于 2015-2-22 05:53:38
你最好是结合实例来说明你的需求。

列举几个数字,告诉我排列后应该是什么样子?
yccpp 发表于 2015-2-21 23:32:36
fcode你好,运行你的程序后,感觉没有判断完全,可能是我没有把问题描述清楚,在输入文件中,如果a 和b是一对,b和c是一对, c和d是一对, a和c是一对, b和d是一对,以此类推,则在输出时把这些数据都归在一起写在一行。谢谢,祝春节快乐!
yccpp 发表于 2015-2-8 01:12:51
谢谢fcode的帮助。
fcode 发表于 2015-2-6 07:31:33
[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit None
  Integer , parameter :: N = 15749!// 行
  Integer , parameter :: N_rows = N !// 行
  Integer :: idata( 2 , N ) , idata_row( 2 , N )
  Integer :: currRow , i , j , k
  Logical :: b( 2 )
  currRow = 0
  Open( 12 , File = "Number.txt" )
  Open( 13 , File = "Number1.txt" )
  Do i = 1 , N
    Read( 12 , * ) idata( : , i )
    j = 0
    b = .false.
    Do j = 1 , i-1
      b(1) = ( any( idata(1,i) == idata(:,j) ) )
      b(2) = ( any( idata(2,i) == idata(:,j) ) )
      if ( any(b) ) exit
    End Do
    if ( j > 0 .and. j <= i-1 ) then
      if( b(1) .and. .NOT.b(2) ) then
        idata_row( 1 , i ) = 0
        idata_row( 2 , i ) = idata_row( 1 , j )        
      elseif( b(2) .and. .NOT.b(1) ) then
        idata_row( 2 , i ) = 0
        idata_row( 1 , i ) = idata_row( 2 , j )
      else
        idata_row( : , i ) = 0
      end if
    else
      currRow = currRow + 1
      idata_row( : , i ) = currRow
    end if
  End Do
  Do i = 1 , currRow
    Do j = 1 , N
      if ( idata_row(1,j) == i ) then
        write( 13 , '(g0,1x)' , advance='no' ) idata(1,j)
      end if
      if ( idata_row(2,j) == i ) then
        write( 13 , '(g0,1x)' , advance='no' ) idata(2,j)
      end if
    End Do
    write(13,*)
  End Do
  Close( 12 )
  Close( 13 )
End Program www_fcode_cn
yccpp 发表于 2015-2-5 15:28:55
谢谢VVT,按你说的,如果下面加一行 35555 22963,也要加在一起,输出结果的第三行就变为 22963 35901 35555.谢谢关注。
vvt 发表于 2015-2-5 08:42:40
我打开看是正常的,不是红色的。不需要编辑。

有一个疑问:

如果出现一行,第一个数据是未出现过的,而第二个是出现过的。如何处理?

比如你的算例,下面加一行:
35555 22963

其中 22963 出现过,而 35555 未出现过。

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-9-21 16:28

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表