鱼C论坛

 找回密码
 立即注册
查看: 1668|回复: 1

[已解决]求助!

[复制链接]
发表于 2022-9-10 16:56:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gandixiwang 于 2022-9-10 17:04 编辑

题目是:设有 2n(n<=6)个球队进行单循环比赛,计划在 2n - 1 天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在 2n - 1 天内每个队都与不同的对手比赛。

无标题.png
这是我的运行结果
#include <stdio.h>
#include <string.h>
#define MAX 128
int mistake(int);//判断是否为2的n次方
void catch_allot(int counts[MAX][MAX],int i,int j);//进行数组元素交换
void getInput(char name[][MAX], int num);//输入队伍名称
int counts[MAX][MAX];

void getInput(char name[][MAX], int num)
{
        int i;
        
        for (i = 0; i < num; i++)
        {
                printf("请输入第%d个队伍的名字:", i+1);
                scanf("%s", name[i]);
                getchar();
        }
}

void catch_allot(int counts[MAX][MAX],int i,int j)
{
        if(i>2)//如果i大于二就再次进入循环
        {
                catch_allot(counts,i/2,j);
        }
        
        for(int card=0;card<=j;card+=i)//card控制输入范围
        {
                for(int card_0=i/2,card_1=0;card_0<i;card_0++,card_1++)//card_0与card_1控制范围内数组列
                {
                        for(int card_2=i/2,card_3=0;card_3<i;card_2++,card_3++)//card_2与card_3控制范围内数组行
                        {
                                counts[card_0][card_2+card]=counts[card_1][card_3+card];
                                if(card_2==i-1)card_2=-1;//如果刚好在范围线,则初始化为-1
                        }
                }
        }
}

int mistake(int num)
{
        if (num & num - 1 || num<1 || num>64)
        {
                printf("参数队伍的数量必须是2的N次方!且不大于64\n");
                printf("请重新输入:");
                return 1;
        }
        else
        {
                return 0;
        }
}
int main(void)
{
        int i,j;
        int num;
        printf("请输入参赛队伍数量:");
        scanf("%d",&num);
        setbuf(stdin,NULL);
        while(mistake(num))
        {
                scanf("%d",&num);
                setbuf(stdin,NULL);
        }
        
        for(i=0;i<num;i++)
        {
                counts[0][i]=i+1;
        }
        //排列比赛顺序
        char name[num][128];
        getInput(name,num);
        catch_allot(counts,num,num);//输入二维数组和数组内拥有的元素的个数
        //counts=二维数组,num=数组内拥有的元素的个数
        printf("比赛安排如下\n");
        printf("队伍");
        for (i = 1; i < num; i++)
        {
                printf("\t第%d天", i);
        }
        putchar('\n');
        //查看排列后的比赛顺序
        for (i = 1; i <= num; i++)
        {
                for (j = 1; j <= num; j++)
                {
                        printf("%s\t", name[counts[i][j]-1]);
                }
                putchar('\n');
        }
        return 0;
}
这是我的代码


无标题1.png
这是用小甲鱼的程序运行的结果
#include <stdio.h>

#define MAX_NUM 64

int schedule[MAX_NUM+1][MAX_NUM+1];

void getInput(char name[][128], int num);
int arrange(int begin, int num);

void getInput(char name[][128], int num)
{
        int i;
        
        for (i = 0; i < num; i++)
        {
                printf("请输入第%d个队伍的名字:", i+1);
                scanf("%s", name[i]);
                getchar();
        }
}

int arrange(int begin, int num)
{
        int i, j;
        
        if (num == 2)
        {
                schedule[begin][1] = begin;
                schedule[begin][2] = begin + 1;
                schedule[begin+1][1] = begin + 1;
                schedule[begin+1][2] = begin;
                return 0;
        }
        
        arrange(begin, num/2); 
        arrange(begin + num/2, num/2);
        
        for (i = begin + num/2; i < begin + num; i++)
        {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule[i][j] = schedule[i-num/2][j-num/2];
                }
        }
        
        for (i = begin; i < begin + num/2; i++)
        {
                for (j = num/2 + 1; j <= num; j++)
                {
                        schedule[i][j] = schedule[i+num/2][j-num/2];
                }
        }
}

int main(void)
{
        int num, i, j;
        
        printf("请输入参赛的队伍数量:");
        scanf("%d", &num);
        
        // 检查num是否2的N次方
        // 注意,这里是&,不是&&
        // &是按位与操作,1&1==1,0&1==0,0&0 == 0
        if (num & num - 1)
        {
                printf("参数队伍的数量必须是2的N次方!\n");
                return -1;
        }
        
        char name[num][128];
        
        getInput(name, num);
        
        arrange(1, num);
        
        printf("\n比赛安排如下:\n");
        printf("队 伍");
        
        for (i = 1; i < num; i++)
        {
                printf("\t第%d天", i);
        }
        
        putchar('\n');
        
        for (i = 1; i <= num; i++)
        {
                for (j = 1; j <= num; j++)
                {
                        printf("%s\t", name[schedule[i][j]-1]);
                }
                putchar('\n');
        }
        
        return 0;
}

这是小甲鱼的代码

我找疯了都找不到哪里影响了输出。。。


ps:结果那里我是做完没问题的了,就是输出时把数字替换成中文后就只能显示一个中文字符了。
而小甲鱼输出中文字符就没问题,可以完整显示
最佳答案
2022-9-10 21:23:16
去掉setbuf(stdin,NULL);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-10 21:23:16 | 显示全部楼层    本楼为最佳答案   
去掉setbuf(stdin,NULL);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 21:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表