|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 gandixiwang 于 2022-9-10 17:04 编辑
题目是:设有 2n(n<=6)个球队进行单循环比赛,计划在 2n - 1 天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在 2n - 1 天内每个队都与不同的对手比赛。
这是我的运行结果
- #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;
- }
复制代码
这是我的代码
这是用小甲鱼的程序运行的结果
- #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:结果那里我是做完没问题的了,就是输出时把数字替换成中文后就只能显示一个中文字符了。
而小甲鱼输出中文字符就没问题,可以完整显示
|
|