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语言 要不要抄代码

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com