一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到M,凡报到M的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
约瑟夫环一般就是解决这种问题的最好算法
#include <stdio.h>
#include <stdlib.h>
int yue(int n,int m)
{
int y;
if(n==1){
y = 0;
}else if(n>1){
y = (yue(n-1,m)+m)%n;
}
return y;
}
int main()
{
int n,y;
scanf("%d",&n);
int m = 3;
y = yue(n,m)+1;
printf("%d",y);
return 0;
}
#include<stdio.h>
int main()
{
int n,j,i=-1,count=0;
int m;
scanf("%d",&n);
scanf("%d",&m);
int a[n];
for(j=0;j<n;j++)
a[j]=0;
while(count<n)
{
for(j=0;j<m;j++)
{
i=(i+1)%n;
if(a[i]!=0)
j--;
}
a[i]=1;
count++;
}
printf("%d ",i+1);
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:题目链接:
进制转换
N转M进制数没考虑负数一直没a😭考虑后马上就a了…
🗡题解通过截图:
思路:算出有几位数字,然后直接一直整除即可
比如9转为2进制 1001
由于9>8且9<16 所以肯定有四位数字(8=1000 16=10000)
9 / (2^3)==1 //最高位的数字 一共有四位数字,最高位肯定是2^3
9-(1*2^3)==1
1 / (2^2)==0 //次高位
1-(0*2^2)==1
1 / (2^1)==0 //次次高位
1 - (0*2^1) ==1
1 / (2^0)==1 //最低位
1 -(0*2^0)=0 //结束循环
//有点像填数字的过程,手动模拟一下即可理解
附上代码:
#include<stdio.h>
#include<math.h>
typedef long long ll;
int main()
{
ll m, n;
scanf("%lld%lld", &m, &n);
if (m == 0)
{
printf("0\n");
}
if (m < 0)//处理负数
{
printf("-");
m = -m;
}
int t = 0;
long long tmp = 1;
while (tmp <= m)//看一共有多少位
{
tmp = tmp*n;
t++;
}
//有t位数
char a[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
while (t)
{
int x = m / pow((double)n, t - 1);
printf("%c", a[x]);
m -= x*pow((double)n, t - 1);
t--;
}
printf("\n");
return 0;
}