鱼C论坛

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

[已解决]求助!

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

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

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

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

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

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

  8. void getInput(char name[][MAX], int num)
  9. {
  10.         int i;
  11.        
  12.         for (i = 0; i < num; i++)
  13.         {
  14.                 printf("请输入第%d个队伍的名字:", i+1);
  15.                 scanf("%s", name[i]);
  16.                 getchar();
  17.         }
  18. }

  19. void catch_allot(int counts[MAX][MAX],int i,int j)
  20. {
  21.         if(i>2)//如果i大于二就再次进入循环
  22.         {
  23.                 catch_allot(counts,i/2,j);
  24.         }
  25.        
  26.         for(int card=0;card<=j;card+=i)//card控制输入范围
  27.         {
  28.                 for(int card_0=i/2,card_1=0;card_0<i;card_0++,card_1++)//card_0与card_1控制范围内数组列
  29.                 {
  30.                         for(int card_2=i/2,card_3=0;card_3<i;card_2++,card_3++)//card_2与card_3控制范围内数组行
  31.                         {
  32.                                 counts[card_0][card_2+card]=counts[card_1][card_3+card];
  33.                                 if(card_2==i-1)card_2=-1;//如果刚好在范围线,则初始化为-1
  34.                         }
  35.                 }
  36.         }
  37. }

  38. int mistake(int num)
  39. {
  40.         if (num & num - 1 || num<1 || num>64)
  41.         {
  42.                 printf("参数队伍的数量必须是2的N次方!且不大于64\n");
  43.                 printf("请重新输入:");
  44.                 return 1;
  45.         }
  46.         else
  47.         {
  48.                 return 0;
  49.         }
  50. }
  51. int main(void)
  52. {
  53.         int i,j;
  54.         int num;
  55.         printf("请输入参赛队伍数量:");
  56.         scanf("%d",&num);
  57.         setbuf(stdin,NULL);
  58.         while(mistake(num))
  59.         {
  60.                 scanf("%d",&num);
  61.                 setbuf(stdin,NULL);
  62.         }
  63.        
  64.         for(i=0;i<num;i++)
  65.         {
  66.                 counts[0][i]=i+1;
  67.         }
  68.         //排列比赛顺序
  69.         char name[num][128];
  70.         getInput(name,num);
  71.         catch_allot(counts,num,num);//输入二维数组和数组内拥有的元素的个数
  72.         //counts=二维数组,num=数组内拥有的元素的个数
  73.         printf("比赛安排如下\n");
  74.         printf("队伍");
  75.         for (i = 1; i < num; i++)
  76.         {
  77.                 printf("\t第%d天", i);
  78.         }
  79.         putchar('\n');
  80.         //查看排列后的比赛顺序
  81.         for (i = 1; i <= num; i++)
  82.         {
  83.                 for (j = 1; j <= num; j++)
  84.                 {
  85.                         printf("%s\t", name[counts[i][j]-1]);
  86.                 }
  87.                 putchar('\n');
  88.         }
  89.         return 0;
  90. }
复制代码

这是我的代码


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

  2. #define MAX_NUM 64

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

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

  6. void getInput(char name[][128], int num)
  7. {
  8.         int i;
  9.        
  10.         for (i = 0; i < num; i++)
  11.         {
  12.                 printf("请输入第%d个队伍的名字:", i+1);
  13.                 scanf("%s", name[i]);
  14.                 getchar();
  15.         }
  16. }

  17. int arrange(int begin, int num)
  18. {
  19.         int i, j;
  20.        
  21.         if (num == 2)
  22.         {
  23.                 schedule[begin][1] = begin;
  24.                 schedule[begin][2] = begin + 1;
  25.                 schedule[begin+1][1] = begin + 1;
  26.                 schedule[begin+1][2] = begin;
  27.                 return 0;
  28.         }
  29.        
  30.         arrange(begin, num/2);
  31.         arrange(begin + num/2, num/2);
  32.        
  33.         for (i = begin + num/2; i < begin + num; i++)
  34.         {
  35.                 for (j = num/2 + 1; j <= num; j++)
  36.                 {
  37.                         schedule[i][j] = schedule[i-num/2][j-num/2];
  38.                 }
  39.         }
  40.        
  41.         for (i = begin; i < begin + num/2; i++)
  42.         {
  43.                 for (j = num/2 + 1; j <= num; j++)
  44.                 {
  45.                         schedule[i][j] = schedule[i+num/2][j-num/2];
  46.                 }
  47.         }
  48. }

  49. int main(void)
  50. {
  51.         int num, i, j;
  52.        
  53.         printf("请输入参赛的队伍数量:");
  54.         scanf("%d", &num);
  55.        
  56.         // 检查num是否2的N次方
  57.         // 注意,这里是&,不是&&
  58.         // &是按位与操作,1&1==1,0&1==0,0&0 == 0
  59.         if (num & num - 1)
  60.         {
  61.                 printf("参数队伍的数量必须是2的N次方!\n");
  62.                 return -1;
  63.         }
  64.        
  65.         char name[num][128];
  66.        
  67.         getInput(name, num);
  68.        
  69.         arrange(1, num);
  70.        
  71.         printf("\n比赛安排如下:\n");
  72.         printf("队 伍");
  73.        
  74.         for (i = 1; i < num; i++)
  75.         {
  76.                 printf("\t第%d天", i);
  77.         }
  78.        
  79.         putchar('\n');
  80.        
  81.         for (i = 1; i <= num; i++)
  82.         {
  83.                 for (j = 1; j <= num; j++)
  84.                 {
  85.                         printf("%s\t", name[schedule[i][j]-1]);
  86.                 }
  87.                 putchar('\n');
  88.         }
  89.        
  90.         return 0;
  91. }
复制代码


这是小甲鱼的代码

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


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

使用道具 举报

发表于 2022-9-10 21:23:16 | 显示全部楼层    本楼为最佳答案   
去掉setbuf(stdin,NULL);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 17:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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