时生 发表于 2017-3-5 16:18:50

一道组合题目,运行超时,求解!

本帖最后由 时生 于 2017-3-5 16:21 编辑

题目就是用户键入一个k(6<k<13),再键入k个数字,然后从这k个数字中选6个出来,列出所有的组合情况。

#include <stdio.h>

int main()
{
        int input = {0};
        int k;
        while(scanf("%d", &k) != 0)
        {
                for(int w = 0; w < k; w++)         scanf("%d", &input);
                for(int i = 0; i <= k-6; i++)       
                {
                        for(int j = i+1; i <= k-5; j++)
                                        for(int u = j+1; u <= k-4; u++)                                               
                                                        for(int h = u+1; h <= k-3; h++)                                                       
                                                                        for(int y = h+1; y <= k-2; y++)
                                                                                        for(int x = y+1; x < k; x++)
                                                                                        {
                                                                                                        printf("%d %d %d %d %d %d\n"
                                                                                                                        , input, input, input, input, input, input);
                                                                                        }               
                }
        }
       
        return 0;
}

zealstar 发表于 2017-3-6 01:10:00

#include <stdio.h>

int main()
{
        int input = {0};
        int k, w, i, j, u, h, y, x;
        while(scanf("%d", &k) != 0)               
        {
                for(w = 0; w < k; w++)
                {
                        scanf("%d", &input);
                }
               
                for(i = 0; i <= k-6; i++)      
                {
                        for(j = i+1; i <= k-5; j++)                        //判定条件i <= k-5 应该是j <= k-5
                                for(u = j+1; u <= k-4; u++)                                                
                                        for(h = u+1; h <= k-3; h++)                                                      
                                                for(y = h+1; y <= k-2; y++)
                                                        for(x = y+1; x < k; x++)
                                                        {
                                                                printf("%d %d %d %d %d %d\n", input, input, input, input, input, input);
                                                        }               
                }
        }
       
        return 0;
}

我稍微改了下,没用C99标准的临时变量。

问题1:for(j = i+1; i <= k-5; j++)这句判断条件按照你的思路应该是j <= k-5

问题2:while(scanf("%d", &k) != 0)
这个循环不跳出?如果scanf输入成功就永久循环?意思排列完成后再次输入?

问题3:你的算法并不能输出所有排列!
例如:我输入7个数字:111,222,333,444,555,666,777
如果i = 7-6 ==1 时排列为:222,333,444,555,666,777输出这一个排列后
然后循环就会结束!因为x = i+5 == 6已经是内循环的最后一次运行,其他几个同理。
那么,按照人的思维,222,444,555,666,777,333的排列呢?333开头的排列呢?{:10_312:}
哪怕原来输出111开头的排列也不全!{:10_285:}
这是逻辑上的问题,还需要再思考吧!{:10_284:}
页: [1]
查看完整版本: 一道组合题目,运行超时,求解!