C语言代码
发布网友
我来回答
共2个回答
热心网友
看你的代码,应该是想通过使用12个for循环嵌套来实现,但是这种方式效率是比较低的,13的12次方有23298085122481种方案,短时间内是看不到电脑的运行结果的。
所以我采用了另一种方法,最终算得的结果是种方案。
#include <stdio.h>
#include "LinkedList.h"
int is_unique(int *array, int value, int len)
{
int i = 0, j = 0;
for(i=0; i<len-1; i++)
{
for(j=i+1; j<len; j++)
{
if(array[i] == array[j])
return 0;
}
}
return 1;
}
int main()
{
int i = 0, j = 0, m = 0, n = 0, k = 0;
int count[4] = {0};
int tmp = 0;
DataType value;
int a[12] = {0}; //用于存放临时组合的数据
int max_num = 0; //加减乘除四种运算中,符合条件的方案数量最少的个数
LinkedList_stru *list_array[4];
LinkedList_stru *list_tmp;
LinkNode_stru *p1, *p2, *p3, *p4;
int flag = 0;
int total = 0;
/* 定义链表指针,用于存放创建的链表首地址 */
LinkedList_stru *list_addition = NULL, *list_subtraction = NULL ;
LinkedList_stru *list_multiplication = NULL, *list_division = NULL ;
printf("\n\n开始玩命分析.........\n");
/* 分析:总共有 +,-,*,÷ 四种运算, 而且运算结果需要在1~13之间。
* 所以,我们可以先把这些所有符合条件的结果求出来.
* */
/* 创建链表 */
list_addition = LinkedList_Create(); //+
list_subtraction = LinkedList_Create(); //-
list_multiplication = LinkedList_Create(); //×
list_division = LinkedList_Create(); //÷
/* 1. 求出 + 运算所有符合要求的方案 */
count[0] = 0;
for(i=1; i<=13; i++)
{
for(j=1; j<=13; j++)
{
tmp = i+j;
if(tmp <= 13)
{
if(i==j || j==tmp || i==tmp)
{
continue;
}
else
{
value.a1 = i;
value.a2 = j;
value.a3 = tmp;
LinkedList_Add_Tail(list_addition,value);
count[0]++;
//printf("%2d + %2d = %2d \n",i,j,(i+j));
}
}
}
}
//printf("计算完毕,+运算符合条件的结果总共有 %d 种 !\n",count[0]);
/* 2. 求出 - 运算所有符合要求的方案 */
count[1] = 0;
for(i=1; i<=13; i++)
{
for(j=1; j<=13; j++)
{
tmp = i-j;
if( tmp > 0 && tmp <= 13)
{
if(i==j || j==tmp || i==tmp)
{
continue;
}
value.a1 = i;
value.a2 = j;
value.a3 = tmp;
LinkedList_Add_Tail(list_subtraction,value);
count[1]++;
//printf("%2d - %2d = %2d \n",i,j,(i-j));
}
}
}
//printf("计算完毕,-运算符合条件的结果总共有 %d 种 !\n",count[1]);
/* 3. 求出 × 运算所有符合要求的方案 */
count[2] = 0;
for(i=1; i<=13; i++)
{
for(j=1; j<=13; j++)
{
tmp = i*j;
if( tmp > 0 && tmp <= 13)
{
if(i==j || j==tmp || i==tmp)
{
continue;
}
value.a1 = i;
value.a2 = j;
value.a3 = tmp;
LinkedList_Add_Tail(list_multiplication,value);
count[2]++;
//printf("%2d × %2d = %2d \n",i,j,(i*j));
}
}
}
//printf("计算完毕,+运算符合条件的结果总共有 %d 种 !\n",count[2]);
/* 4. 求出 ÷ 运算所有符合要求的方案 */
count[3] = 0;
for(i=1; i<=13; i++)
{
for(j=1; j<=13; j++)
{
tmp = i%j;
if( tmp == 0 )
{
if(i==j || j==(i/j) || i==(i/j))
{
continue;
}
value.a1 = i;
value.a2 = j;
value.a3 = (i/j);
LinkedList_Add_Tail(list_division,value);
count[3]++;
//printf("%2d ÷ %2d = %2d \n",i,j,(i/j));
}
}
}
//printf("计算完毕,÷运算符合条件的结果总共有 %d 种 !\n\n",count[3]);
printf("list_addition: clen = %d !\n",list_addition->clen);
printf("list_subtraction: clen = %d !\n",list_subtraction->clen);
printf("list_multiplication: clen = %d !\n",list_multiplication->clen);
printf("list_division: clen = %d !\n",list_division->clen);
list_array[0] = list_addition;
list_array[1] = list_subtraction;
list_array[2] = list_multiplication;
list_array[3] = list_division;
max_num = list_array[0]->clen;
for(i=0; i<4; i++)
{
if(max_num >= list_array[i]->clen)
{
max_num = list_array[i]->clen;
//list_tmp = num[i];
}
}
//printf("最多只能有 %d 种方案 !\n",max_num);
/* 从上面的计算结果我们可以知道,最多只能有10种方案, 因为乘法和除法这两种运算均只有10种方案符合条件
* 所以,这里我们就基于除法去做匹配.按理说不应该这么做的,应该在代码中进行判断,但是为了节省时间,只能这样了。
**/
/* 遍历链表 */
p4 = list_division->pHead->pNext ;
for(i=0; i<list_division->clen; i++)
{
p3 = list_multiplication->pHead->pNext ;
for(j=0; j<list_multiplication->clen; j++)
{
p2 = list_subtraction->pHead->pNext ;
for(m=0; m<list_subtraction->clen; m++)
{
p1 = list_addition->pHead->pNext ;
for(n=0; n<list_addition->clen; n++)
{
flag = 111;
a[0] = p1->data.a1; a[1] = p1->data.a2; a[2] = p1->data.a3;
a[3] = p2->data.a1; a[4] = p2->data.a2; a[5] = p2->data.a3;
a[6] = p3->data.a1; a[7] = p3->data.a2; a[8] = p3->data.a3;
a[9] = p4->data.a1; a[10] = p4->data.a2; a[11] = p4->data.a3;
for(k=0; k<sizeof(a)/sizeof(a[0]); k++)
{
if(!is_unique(a,a[k],sizeof(a)/sizeof(a[0])))
{
flag = 0;
break;
}
}
if(flag == 111)
{
//printf("\n");
total ++;
printf("方案 %d :\n",total);
printf("%2d + %2d = %2d \n",a[0],a[1],a[2]);
printf("%2d - %2d = %2d \n",a[3],a[4],a[5]);
printf("%2d × %2d = %2d \n",a[6],a[7],a[8]);
printf("%2d ÷ %2d = %2d \n",a[9],a[10],a[11]);
printf("\n");
}
p1 = p1->pNext;
}
p2 = p2->pNext;
}
p3 = p3->pNext;
}
p4 = p4->pNext;
}
printf("计算完毕,总共有 %d 种方案 !\n",total);
return 0;
}
热心网友
初学C语言 要不要抄代码