求代码,能稍微讲解下最好

中亿财经网 kefu01 2024-02-02 08:14:56

一、求代码,能稍微讲解下最好

第二题,手打LDj中亿财经网财经门户

using namespace std;LDj中亿财经网财经门户

int a[999][999];LDj中亿财经网财经门户

int main()LDj中亿财经网财经门户

{LDj中亿财经网财经门户

int n,i,j,k,x,y;LDj中亿财经网财经门户

cin>>n;LDj中亿财经网财经门户

x=1;y=1;k=1;LDj中亿财经网财经门户

a[x][y]=k;LDj中亿财经网财经门户

for(i=1;i<=n*n;i++)LDj中亿财经网财经门户

{ if(a[x+1][y]==0&&a[x][y-1]==0&&y-1>=1){y--;a[x][y]=k+1;k++;}LDj中亿财经网财经门户

else if(a[x+1][y]==0&&x+1<=n){x++;a[x][y]=k+1;k++;}LDj中亿财经网财经门户

else if(a[x][y+1]==0&&y+1<=n){y++;a[x][y]=k+1;k++;}LDj中亿财经网财经门户

else if(a[x-1][y]==0&&x-1>=1){x--;a[x][y]=k+1;k++;}LDj中亿财经网财经门户

else if(a[x][y-1]==0&&y-1>=1){y--;a[x][y]=k+1;k++;}LDj中亿财经网财经门户

}LDj中亿财经网财经门户

for(i=1;i<=n;i++)LDj中亿财经网财经门户

{LDj中亿财经网财经门户

cout<for(j=1;j<=n;j++) cout<<(n*n+1)-a[j][i]<< ; } system(pause); return 0; } 编译器测试已通过LDj中亿财经网财经门户

二、代号17的介绍

代号17是个悲剧结局,小光最后死了,LDj中亿财经网财经门户

三、求VB编码:17人围成一圈,编号为1,2,3…,17,从第1号开始报数,报到3的倍数的人离开,一直数下去,直到最后剩下1人,求此人的编号。

Private Sub Form_Activate()LDj中亿财经网财经门户

Dim temp() As Integer, arr() As Integer, n As Integer, m As Integer, i As IntegerLDj中亿财经网财经门户

ReDim arr(1 To 17)LDj中亿财经网财经门户

For i = 1 To 17LDj中亿财经网财经门户

arr(i) = iLDj中亿财经网财经门户

NextLDj中亿财经网财经门户

Do Until UBound(arr) = 2LDj中亿财经网财经门户

For i = 1 To UBound(arr)LDj中亿财经网财经门户

If i Mod 3 = 0 ThenLDj中亿财经网财经门户

arr(i) = 0LDj中亿财经网财经门户

n = n + 1LDj中亿财经网财经门户

End IfLDj中亿财经网财经门户

NextLDj中亿财经网财经门户

ReDim temp(1 To UBound(arr) - n)LDj中亿财经网财经门户

For i = 1 To UBound(arr) - UBound(arr) Mod 3LDj中亿财经网财经门户

If arr(i) <> 0 ThenLDj中亿财经网财经门户

m = m + 1LDj中亿财经网财经门户

temp(m + UBound(arr) Mod 3) = arr(i)LDj中亿财经网财经门户

End IfLDj中亿财经网财经门户

NextLDj中亿财经网财经门户

m = 0LDj中亿财经网财经门户

For i = UBound(arr) - UBound(arr) Mod 3 + 1 To UBound(arr)LDj中亿财经网财经门户

m = m + 1LDj中亿财经网财经门户

temp(m) = arr(i)LDj中亿财经网财经门户

NextLDj中亿财经网财经门户

ReDim arr(1 To UBound(temp))LDj中亿财经网财经门户

For i = 1 To UBound(arr)LDj中亿财经网财经门户

arr(i) = temp(i)LDj中亿财经网财经门户

NextLDj中亿财经网财经门户

m = 0: n = 0LDj中亿财经网财经门户

LoopLDj中亿财经网财经门户

MsgBox arr(2) & 胜出!LDj中亿财经网财经门户

Unload MeLDj中亿财经网财经门户

End SubLDj中亿财经网财经门户

四、java编程17人编号为0-16围成一圈,0号人开始从1报数,凡是报数为3倍数的人离开圈子,继续到一个,问他编号

这是一个约瑟夫环的问题LDj中亿财经网财经门户

解答如下:LDj中亿财经网财经门户

依据提议,可以将题目等价变换为:“n(n=17)人编号为0到(n-1)围成一圈,0号人开始从0报数,凡是报数为m-1 (m=3)倍数的人离开圈子,继续到一个,问他编号”LDj中亿财经网财经门户

一开始的状态LDj中亿财经网财经门户

0,1,2,3,4,5 ..... (n-2), (n-1) 【n个人】LDj中亿财经网财经门户

第一个人被踢之后 设第一个被踢的人的编号为k, 则 k = m%n-1 【当n=17,m=3时,k=2。也就是说编号为2的人离开了圈子】 LDj中亿财经网财经门户

这时候的状态LDj中亿财经网财经门户

0, .... (k-1), (k+1) ,(k+2)...(n-2),(n-1) 【(n-1)个人,当n=17,m=3时: 0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16】LDj中亿财经网财经门户

将这时候的编号做转换. 因为是围城一个圈子,下一个开始数的是(k+1).所以也可以表示为LDj中亿财经网财经门户

(k+1),(k+2) ... (n-2),(n-1),0....(k-1) 【(n-1)个人,当n=17,m=3时: 3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,1】LDj中亿财经网财经门户

重新编号。得到:LDj中亿财经网财经门户

0,1,2,3,4...(n-3),(n-2)【(n-1)个人】 这个时候 ,这里重新构成了一个约瑟夫环。也就是说,这是一个递推的关系。LDj中亿财经网财经门户

这里我们进行了重新编号。那么 (n-1)个人和 n个人之间的编号不一样的。但是两者之间有一定的关系,可以冲新编号推导出老的LDj中亿财经网财经门户

公式如下: i' = (i+k)%(n-1) 【比如,当n=17,m=3时 . 新的环编号是 (n-2),我要求他在老的环中的编号,那么编号是 i' = ( (n-2) + k ) % (n-1) = 17%16 = 1,就是老的换种编号为1的那一个 】LDj中亿财经网财经门户

反过来有 :i = (i'+m)%nLDj中亿财经网财经门户

有了上面的推断,可以代码如下:LDj中亿财经网财经门户

int ysf(int n,int m){LDj中亿财经网财经门户

if(n==1){LDj中亿财经网财经门户

return 0; //当环内只有一个人的时候,就是他自己LDj中亿财经网财经门户

}LDj中亿财经网财经门户

return (ysf(n-1,m) + m ) % n ;LDj中亿财经网财经门户

}LDj中亿财经网财经门户

------------------完整代码---------------------LDj中亿财经网财经门户

public class Test{LDj中亿财经网财经门户

public static void main(String[] args){LDj中亿财经网财经门户

int a = 17;LDj中亿财经网财经门户

int b = 3;LDj中亿财经网财经门户

System.out.println(ysf(a,b));LDj中亿财经网财经门户

}LDj中亿财经网财经门户

static int ysf(int n,int m){LDj中亿财经网财经门户

if(n==1){LDj中亿财经网财经门户

return 0; LDj中亿财经网财经门户

}LDj中亿财经网财经门户

return (ysf(n-1,m) +m) % n;LDj中亿财经网财经门户

}LDj中亿财经网财经门户

}LDj中亿财经网财经门户