标题:复杂的数组计算
只看楼主
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:40 
在 6楼 代码的基础上改善了一下。(6楼代码不好的地方在于,可能先筛选出k比较小的排列,后面需要舍弃)

程序代码:
#include <stdio.h>

size_t foo( const int a[static 21] )
{
    size_t k_max=0, k=21;
    for( unsigned m=0; m!=(1u<<20)-1; )
    {
        _Bool bok = 1;
        for( unsigned i=0; bok && i!=21; ++i )
            if( (~m)&(1u<<i) )
                for( unsigned j=i+1; bok && j!=21; ++j )
                    if( (~m)&(1u<<j) )
                        bok = a[j-i]==a[0];

        if( bok && k_max==0 )
            k_max = k;
        if( bok && k==k_max )
        {
            for( unsigned i=0; i!=21; ++i )
                if( (~m)&(1u<<(21-1-i)) )
                    printf( "%u, ", i );
            printf( "k=%zu\n", k_max );
        }

        // next m
        unsigned r = m==0 ? 1 : (((m|(m-1))+1)|((m^((m|(m-1))+1))/((m^(m-1))+1)/2)) & ((1u<<20)-1);
        if( r<m && k_max!=0 )
            break;
        if( m==0 || r<m )
            --k;
        m = r<m ? ((r<<2)|3) & ((1u<<20)-1) : r;
    }
    return k_max;
}

int main( void )
{
    const int a[21] = { 10, 10, 10, 45, 87, 66, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 85, 47, 15, 10, 10 };
    foo( a );
}


输出结果
0, 1, 2, 8, 9, 10, k=6
0, 1, 2, 8, 9, 15, k=6
0, 1, 2, 8, 14, 15, k=6
0, 1, 2, 9, 10, 11, k=6
0, 1, 2, 10, 11, 12, k=6
0, 1, 2, 11, 12, 13, k=6
0, 1, 2, 12, 13, 14, k=6
0, 1, 2, 13, 14, 15, k=6
0, 1, 7, 8, 9, 15, k=6
0, 1, 7, 8, 9, 20, k=6
0, 1, 7, 8, 14, 15, k=6
0, 1, 7, 8, 14, 20, k=6
0, 1, 7, 13, 14, 15, k=6
0, 1, 7, 13, 14, 20, k=6
0, 1, 8, 9, 10, 20, k=6
0, 1, 9, 10, 11, 20, k=6
0, 1, 10, 11, 12, 20, k=6
0, 1, 11, 12, 13, 20, k=6
0, 1, 12, 13, 14, 20, k=6
0, 6, 7, 8, 14, 15, k=6
0, 6, 7, 8, 14, 20, k=6
0, 6, 7, 8, 19, 20, k=6
0, 6, 7, 13, 14, 15, k=6
0, 6, 7, 13, 14, 20, k=6
0, 6, 7, 13, 19, 20, k=6
0, 6, 12, 13, 14, 20, k=6
0, 6, 12, 13, 19, 20, k=6
0, 7, 8, 9, 19, 20, k=6
0, 8, 9, 10, 19, 20, k=6
0, 9, 10, 11, 19, 20, k=6
0, 10, 11, 12, 19, 20, k=6
0, 11, 12, 13, 19, 20, k=6


[此贴子已经被作者于2020-10-11 10:06编辑过]

2020-10-10 15:01
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
因为我不是专业的,所以我用的编译器(devcpp)很古老啦,请问你用的是什么编译器呢?
2020-10-10 21:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用自学的数学在2020-10-10 21:11:02的发言:

因为我不是专业的,所以我用的编译器(devcpp)很古老啦,请问你用的是什么编译器呢?


devcpp 是个IDE,它可以使用多种不同的编译器。

我假设你用的是 TDM-GCC 4.9.2,编译报什么错?
假如是 error: 'for' loop initial declarations are only allowed in C99 or C11 mode 等,
那你就按其说的那样,编译参数添加 -std=c11 或 -std=c99
2020-10-11 10:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503338-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.253529 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved