请教这几个C语言程序设计题?

来源:百度知道 编辑:UC知道 时间:2024/06/01 22:33:51
不胜感激......
1. 有 N 个人围成一圈参加游戏,游戏的规则是:
N个人的编号分别为1、2、……、N,以编号为‘1’的人开始报数,报到 M 时该人跳出圈子,下一人继续报数。按此要求依次输出所有跳出圈子人员的编号。

2. 已知一维数组 A 共有25个元素,值为:A(I)=I,现将此一维数组存入二维数组 B(5,5),存放次序为:
A(1) A(2) A(5) A(10) A(17)
A(4) A(3) A(6) A(11) A(18)
A(9) A(8) A(7) A(12) A(19)
A(16) A(15) A(14) A(13) A(20)
A(25) A(24) A(23) A(22) A(21)
即:
B(1,1)=A(1) B(1,2)=A(2) B(1,3)=A(5) B(1,4)=A(10) B(1,5)=A(17)…

4. 魔术矩阵问题:魔术矩阵由一个n×n(n为奇数)的整数矩阵构成,矩阵中的整数
值是从1~n2 。 每一行、每一列和两个对角线上数值之和相等。例如下面n为5的
魔术矩阵,它的和是65:
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11

1:
这个是传统约瑟夫问题。。~我有类似的!~
#include<stdio.h>
void main()
{
int s=0,n,k,i,ren=0,t,b;//REN来统计人数,
int r[101];
scanf("%d",&n); scanf("%d",&k);
for(i=1;i<=n;i++)r[i]=1;
i=1;
t=n;
b=k%t;//报的数太大时,可以用求模
while(ren<n-1)
{
s+=r[i]; //S相当报的数,每人加一,死了是0;
if(k%t==0)b=k;
else b=k%t;
if(s%b==0)
{
if (r[i])
{
printf("%d\n",i);//i是他的标号
ren++;
t=t-1;}//如果r[i]=0,REN就不++,因为他已经死过啦!
r[i]=0;
s=0;
}
i++;
if(i>n) i=1;//超过了就重头来咯~~嘿嘿~~

}

}
2: 没看出来
3:这个的排列是生成时有规律的。
你可以去搜下~我不忘啦

1、楼主你可以发现,所有出场的编号都会满足一个条件,即:(编号+N)%M=0,这样子用一个数组就可以解决这个问题了,算法就是这样子。
2、报歉,我也没看出这数组的规律来
3、用for循环应该可以做出来,要是估计很复杂啊