如何用C语言编写一个程序实现这个问题?(相关搜索:c语言)

img


学霸帮帮我如何用c语言编程程序实现这个问题,ggccvbnnhhgcvvbbjj

暴力穷举😂


int hasNum(int *num, int count, int val)
{
    for (int i = 0; i < count; i++)
        if (num[i] == val)
            return 1;
    return 0;
}

void print(int *h, int count, int s1, int s2, int s3)
{
    printf("%d\n", count);
    printf("%2d+%2d+%2d+%2d=%d\n", h[0], h[3], h[5], h[6], s1);
    printf("%2d+%2d+%2d+%2d=%d\n", h[1], h[3], h[4], h[6], s2);
    printf("%2d+%2d+%2d+%2d=%d\n", h[2], h[4], h[5], h[6], s3);
    printf("\n");
}

void printList(int *h, int count)
{
    for (int i = 0; i < count; i++)
    {
        printf("%d ", h[i]);
    }
    printf("\n");
}

int main()
{
    int N = 7;
    int num[] = {1, 3, 5, 7, 9, 11, 13};
    int h[7], count = 1;

    int s1, s2, s3;
    int i, j, k, g2a, g2b, g2c, g3;
    for (i = 0; i < N; i++)
    {
        memset(h, 0, N * sizeof(int));
        h[0] = num[i];
        for (j = 0; j < N; j++)
        {
            if (hasNum(h, 1, num[j]))
                continue;
            h[1] = num[j];
            for (k = 0; k < N; k++)
            {
                if (hasNum(h, 2, num[k]))
                    continue;
                h[2] = num[k];
                for (g2a = 0; g2a < N; g2a++)
                {
                    if (hasNum(h, 3, num[g2a]))
                        continue;
                    h[3] = num[g2a];
                    for (g2b = 0; g2b < N; g2b++)
                    {
                        if (hasNum(h, 4, num[g2b]))
                            continue;
                        h[4] = num[g2b];
                        for (g2c = 0; g2c < N; g2c++)
                        {
                            if (hasNum(h, 5, num[g2c]))
                                continue;
                            h[5] = num[g2c];
                            for (g3 = 0; g3 < N; g3++)
                            {
                                if (hasNum(h, 6, num[g3]))
                                    continue;
                                h[6] = num[g3];
                                s1 = h[0] + h[3] + h[5] + h[6];
                                s2 = h[1] + h[3] + h[4] + h[6];
                                s3 = h[2] + h[4] + h[5] + h[6];
                                if (s1 == s2 && s1 == s3 && s2 == s3)
                                {
                                    print(h, count++, s1, s2, s3);
                                    // printList(h, 7);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return 0;
}

可以暴力枚举来实现。

代码如下:


#include <stdio.h>

int main(void){
    
    int s[7] = {1,3,5,7,9,11,13};
    
    int num=0;
    /**
        代码思路为,将3个圆圈放数字的每个小圈内依次标记序号,从i0i6,然后每个小圈穷举遍历每个数组下标,以取到数组s中每个数字
        再在循环判断中,当每个圈内取到的下标不同,并且每个大圈内的数字和相等时,输出每个圆圈组合的数字
        本题中,每个小圈内的序号依次放置如下;
        
               i4
                    i5
            i1   i2    i6
           i0     i3    
        
    **/ 
    for(int i0=0;i0<7;i0++){    
        for(int i1=0;i1<7;i1++){
            for(int i2=0;i2<7;i2++){
                for(int i3=0;i3<7;i3++){
                    for(int i4=0;i4<7;i4++){
                        for(int i5=0;i5<7;i5++){
                            for(int i6=0;i6<7;i6++){
                                
                                    
                                    int sum1 = s[i0]+s[i1]+s[i2]+s[i3]; //第一个圆圈的内数字的和 
                                    int sum2 = s[i1]+s[i2]+s[i4]+s[i5]; //第二个圆圈的内数字的和 
                                    int sum3 = s[i2]+s[i3]+s[i5]+s[i6]; //第三个圆圈的内数字的和 
                                    
                                    // 如果三个圆内数字相等,并且每个圈内数字不同,则打印每个组合的数字 
                                    if(
                                        (sum1==sum2&&sum2==sum3)    
                                        
                                        &&                                    
                                        (i0!=i1&&i0!=i2&&i0!=i3&&i0!=i4&&i0!=i5&&i0!=i6)
                                        &&
                                        (i1!=i2&&i1!=i3&&i1!=i4&&i1!=i5&&i1!=i6)
                                        &&
                                        (i2!=i3&&i2!=i4&&i2!=i5&&i2!=i6)
                                        &&
                                        (i3!=i4&&i3!=i5&&i3!=i6)
                                        &&
                                        (i4!=i5&&i4!=i6)
                                        &&
                                        (i5!=i6) 
                                        
//                                        (s[i0]!=s[i1]&&s[i0]!=s[i2]&&s[i0]!=s[i3]&&s[i0]!=s[i4]&&s[i0]!=s[i5]&&s[i0]!=s[i6]
//                                        &&
//                                        s[i1]!=s[i2]&&s[i1]!=s[i3]&&s[i1]!=s[i4]&&s[i1]!=s[i5]&&s[i1]!=s[i6]
//                                        &&
//                                        s[i2]!=s[i3]&&s[i2]!=s[i4]&&s[i2]!=s[i5]&&s[i2]!=s[i6]
//                                        &&
//                                        s[i3]!=s[i4]&&s[i3]!=s[i5]&&s[i3]!=s[i6]
//                                        &&
//                                        s[i4]!=s[i5]&&s[i4]!=s[i6]
//                                        &&
//                                        s[i5]!=s[i6])
                                        
                                    )
                                        {
                                            num++;
                                            printf("第%d组和为%d:\n",num,sum1);
                                            printf("数字依次为:%d %d %d %d %d %d %d\n",s[i0],s[i1],s[i2],s[i3],s[i4],s[i5],s[i6]);
                                            printf("第一个圆内的数字为:%d, %d, %d, %d\n",s[i0],s[i1],s[i2],s[i3]);    
                                            printf("第二个圆内的数字为:%d, %d, %d, %d\n",s[i1],s[i2],s[i4],s[i5]);    
                                            printf("第三个圆内的数字为:%d, %d, %d, %d\n\n",s[i2],s[i3],s[i5],s[i6]);    
                                        }
                                        
                                        
                                        
                                
                            }
                                
                            }
                        }
                    }
                }
            }
    } 

    return 0; 
} 

img

【以下回答由 GPT 生成】

我可以帮助你解决这个问题。请告诉我具体的问题是什么,以便我能够给出更准确的解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

#include "stdafx.h"
int pNumList[] = { 1,3,5,7,9,11,13};
int pCircle[7] = { 0 };
void PrintNum(int nTotal)
{
    int i = 0;
    for(i=0; i<7; ++i)
    {
        printf("%d ",pCircle[i]);
    }
    printf("%d \n ", nTotal);
}
int TestNum()
{
    int n1,n2,n3;
    n1 = pCircle[0] + pCircle[1] + pCircle[2] + pCircle[3];
    n2 = pCircle[1] + pCircle[2] + pCircle[4] + pCircle[5];
    n3 = pCircle[2] + pCircle[3] + pCircle[5] + pCircle[6];
    if( n1== n2 && n2==n3 )
        return n1;
    return 0;
}
int Cal( int *pNumber, int nSize )
{
    int i = 0;
    int j=0;
    if( nSize == 1 )
    {
        pCircle[7-nSize] = *(pNumber + i);
        int nTotal = TestNum();
        if( nTotal>0 )
            PrintNum(nTotal);
        return 1;
    }

    for(i=0; i<nSize; ++i)
    {
        int pNumTmp[7]={0};
        int k=0;
        pCircle[7-nSize] = *(pNumber + i);
        for( j=0; j<nSize; ++j )
        {
            if( i != j )
                pNumTmp[k++]=*(pNumber + j);
        }
        Cal( pNumTmp, k );
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    Cal( pNumList, 7);
    return 0;
}