暴力穷举😂
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个圆圈放数字的每个小圈内依次标记序号,从i0到i6,然后每个小圈穷举遍历每个数组下标,以取到数组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;
}
【以下回答由 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;
}