| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1220 人关注过本帖
标题:输出内容不对
只看楼主 加入收藏
WeiDing
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2023-5-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
输出内容不对
不知为什么,输出内容缺少数组中的 1,请指教(可在原程序上改编)
#include "stdio.h"
void oneprintCombination(int*arr1,const int length,int start,int getcount,int*tempArr,const int tempLength,int*total1)
{
    if(getcount==0)
    {
        (*total1)++;
        for(int index=0;index<tempLength;index++)
        {
            printf("%d",tempArr[index]);
        }
        printf("\n");
        return;
    }
    if(getcount>(length-start)||tempLength<getcount||getcount<1)
    {
        return;
    }
    for(int i=start;i<length;i++)
    {
        tempArr[tempLength-getcount]=arr1[i];
        oneprintCombination(arr1,length,i+1,getcount-1,tempArr,tempLength,total1);
    }
}
int main(int argc,char argv[])
{
    int a = 0;
    int*total1=&a;
    int arr1[]={1,2,3,4,5,6,7,8,9,10,11,12};
    int temp1[]={0,0,0,0};
    oneprintCombination(arr1,12,0,5,temp1,5,total1);
    printf("\n");
    printf("total1:%d\n",(int)*total1);
   
}
输出结果:
2581011
2581012
2581112
2591011
2591012
2591112
25101112
26789
267810
267811
267812
267910
267911
267912
2671011
2671012
2671112
268910
268911
268912
2681011
2681012
2681112
2691011
2691012
2691112
26101112
278910
278911
278912
2781011
2781012
2781112
2791011
2791012
2791112
27101112
2891011
2891012
2891112
28101112
29101112
34567
34568
34569
345610
345611
345612
34578
34579
345710
345711
345712
34589
345810
345811
345812
345910
345911
345912
3451011
3451012
3451112
34678
34679
346710
346711
346712
34689
346810
346811
346812
346910
346911
346912
3461011
3461012
3461112
34789
347810
347811
347812
347910
347911
347912
3471011
3471012
3471112
348910
348911
348912
3481011
3481012
3481112
3491011
3491012
3491112
34101112
35678
35679
356710
356711
356712
35689
356810
356811
356812
356910
356911
356912
3561011
3561012
3561112
35789
357810
357811
357812
357910
357911
357912
3571011
3571012
3571112
358910
358911
358912
3581011
3581012
3581112
3591011
3591012
3591112
35101112
36789
367810
367811
367812
367910
367911
367912
3671011
3671012
3671112
368910
368911
368912
3681011
3681012
3681112
3691011
3691012
3691112
36101112
378910
378911
378912
3781011
3781012
3781112
3791011
3791012
3791112
37101112
3891011
3891012
3891112
38101112
39101112
45678
45679
456710
456711
456712
45689
456810
456811
456812
456910
456911
456912
4561011
4561012
4561112
45789
457810
457811
457812
457910
457911
457912
4571011
4571012
4571112
458910
458911
458912
4581011
4581012
4581112
4591011
4591012
4591112
45101112
46789
467810
467811
467812
467910
467911
467912
4671011
4671012
4671112
468910
468911
468912
4681011
4681012
4681112
4691011
4691012
4691112
46101112
478910
478911
478912
4781011
4781012
4781112
4791011
4791012
4791112
47101112
4891011
4891012
4891112
48101112
49101112
56789
567810
567811
567812
567910
567911
567912
5671011
5671012
5671112
568910
568911
568912
5681011
5681012
5681112
5691011
5691012
5691112
56101112
578910
578911
578912
5781011
5781012
5781112
5791011
5791012
5791112
57101112
5891011
5891012
5891112
58101112
59101112
678910
678911
678912
6781011
6781012
6781112
6791011
6791012
6791112
67101112
6891011
6891012
6891112
68101112
69101112
7891011
7891012
7891112
78101112
79101112
89101112

total1:792



             Press any key to continue
搜索更多相关主题的帖子: int printf 输出 index 内容 
2023-06-05 15:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
不知所云!
起码,你得告诉别人你想完成什么功能,否则哪来的对或不对。
2023-06-05 16:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
我将题主代码进行简化,去掉冗余变量,去掉分工错误,如下

程序代码:
#include <stdio.h>
#include <stdlib.h>

static size_t foo_( const int input[], size_t input_cnt, int output[], size_t output_cnt, size_t output_rawcnt )
{
    if( output_cnt == 0 )
    {
        for( size_t i=0; i!=output_rawcnt; ++i )
            printf( "%d", (output-output_rawcnt)[i] );
        putchar( '\n' );
        return 1;
    }

    size_t count = 0;
    for( size_t i=0; i+output_cnt<=input_cnt; ++i )
    {
        output[0] = input[i];
        count += foo_( input+i+1, input_cnt-i-1, output+1, output_cnt-1, output_rawcnt );
    }
    return count;
}

size_t foo( const int input[], size_t input_cnt, size_t output_cnt )
{
    if( input_cnt < output_cnt )
        return 0;
    int* output = malloc( output_cnt * sizeof(int) );
    size_t count = foo_( input, input_cnt, output, output_cnt, output_cnt );
    free( output );
    return count;
}

#define foo_c(input,output_cnt) foo((input), sizeof((input))/sizeof(*(input)), (output_cnt))

int main( void )
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    
    size_t total1 = foo_c( arr, 5 );
    printf("total: %zu\n", total1 );
}


简化代码只是为了适合人类阅读,原代码中的所有缺陷依然保留
1. 它算不上 排列组合
2. 使用了最恶的递归
3. 对于 排列组合 而言,数量庞大,无法保证用于计数的变量不溢出
4. 这种简陋的 排列组合 毫无存在意义。有空时,我写个在数学公式上与其完全等价的算法
2023-06-06 09:37
WeiDing
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2023-5-10
收藏
得分:0 
我这个程序要完成的功能:就是组合问题,即从12个数中每次取出5个数的组合;
你在上面给我改编的程序,我的编译器运行有错误,是在第27行和41行。谢谢!
2023-06-06 13:15
WeiDing
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2023-5-10
收藏
得分:0 
回复 4楼 WeiDing
还有:我这个程序如果是10以内取5个,就没问题,超出10就不行,我试过。
2023-06-06 13:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
我的编译器运行有错误,是在第27行和41行。谢谢!

不要打哑谜,正常人会说出是什么错误,把编译器给出的错误贴出来。


我来说个亲身经历的事。
那还是八十年代,一个乡村小学收到捐款后把学校翻新了一下。为了庆贺,请来了 大小狗官、土豪劣绅 齐聚操场主席台,台下 无业游民、泼妇懒汉 济济一堂。
当好不容易临到校长表演“咳咳咳,喂喂喂,我来讲几句……”时,台下老汉把瓜子壳一吐,大声来了句“这学校有问题!”
操场上顿时一静,落针可闻,主席台上诸位戏谑地盯向校长,眼中冒着绿光,而校长张嘴却无言,细汗密布额头。
众人屏住呼吸,期待着老汉的下一句,短短几秒钟像过了一千年,老汉却悠闲地从口袋里掏出瓜子又嗑了起来。
终于有个干部受不了,出声道“老人家,莫怕,你有什么话直说,我们给你作主”
老汉:“门匾上原来有五个字,现在少了一个。老汉我不识字,但几个数我还是会数的”。(原来是「新光乡小学」,现在改名为「曙光学校」)
台上台下顿时热闹起来,不雅词四处飘荡。
2023-06-06 14:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 5楼 WeiDing
int temp1[]={0,0,0,0} 长度是 4
那么 oneprintCombination(arr1,12,0,5,temp1,5,total1) 中 5 是哪里来的?
2023-06-06 14:55
WeiDing
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2023-5-10
收藏
得分:0 
回复 5楼 WeiDing
第27行:error C2440:'initializing ':cannot convert from 'void*'to'int*'
第41行:varning C4508: 'main':function should return a value;'void' return type assumed
2023-06-06 16:30
WeiDing
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2023-5-10
收藏
得分:0 
回复 7楼 rjsp
int temp1[]={0,0,0,0} 长度是 4
那么 oneprintCombination(arr1,12,0,5,temp1,5,total1) 中 5 是哪里来的?

1 int temp1[]={0,0,0,0}长度是4,可改成5和6都不行;
2 oneprintCombination(arr1,12,0,5,temp1,5,total1)里的5,是在12个数组里取出5个组合的意思。
2023-06-06 16:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
第27行:error C2440:'initializing ':cannot convert from 'void*'to'int*'
我怀疑你在用C++编译器在编译C代码。
看得出,你用的是VC。那么你看看源文件是什么扩展名,如果是 .cpp,那么是当成 C++代码 编译的;你应该用 .c 扩展名,即将之当成 C代码 编译。

第41行:varning C4508: 'main':function should return a value;'void' return type assumed
那我怀疑你用的VC版本太低了,因为main函数在上个世纪末就被要求默认return 0;
而VC自从VS2015开始支持C语言,建议你使用当今的VS2022

1 int temp1[]={0,0,0,0}长度是4,可改成5和6都不行;
怎么个不行法呢?说话不能又只说半截
你把 int temp1[]={0,0,0,0} 改为 int temp1[]={0,0,0,0,0} 或 int temp1[5]={0,0,0,0} 之后,输出什么?
2023-06-06 16:59
快速回复:输出内容不对
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021089 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved