用C++写一个程序,n个小朋友围成圈,第 1位小朋友从 1开始报数,如果某小朋友报到 m的倍数或报到末位 C++编程:n个人围成一圈,编号是0~(n-1),从第1个人...

作者&投稿:潜的 (若有异议请与网页底部的电邮联系)
//#include "stdafx.h"//vc++6.0加上这一行.
#include <iostream>
using namespace std;
void main(void){
int n,i,j,k,x,*p;
cout << "How many children?\nn=";
cin >> n;
if(!(p=new int[n])){
cout << "Application memory failure for the children...\n";
exit(0);
}
for(i=0;i<n;p[i]=1+i++);
cout << "Enter Unlucky number...\nx=";
cin >> x;
if(x<1 || x>n){
cout << "Illegal input...\n";
exit(0);
}
for(k=i=0,j=1;k<n;i++){
if(i==n) i=0;
if(p[i]==0) continue;
if(j++%x==0){
k++;
p[i]=0;
}
}
cout << "The winner is the No." << i << endl;
delete [n]p;
}

这段代码可以实现这个
#include <iostream>
using namespace std;

int LastRemaining(int n, unsigned int m){
if (n <= 0 || m < 0)
return -1;
int last = 1;
for (int i = 2; i <= n; i++)
last = (last + m-1) % i+1;
return last;
}
int main(){
int lastNum;
lastNum = LastRemaining(5, 3);
cout << lastNum << endl;
while (1){}
return 0;
}


急求,谢谢哥哥姐姐啊
lfgindsdrh参考哈·····

c++程序:n个小孩排一圈,从1开始报数,3的倍数出列,循环到结束,输出小孩出列顺序~

这是我的程序,如下:
#include
using namespace std;
void main()
{
int i,j,t,n;
cout<<"输入人数:"<<endl;
cin>>n;
int *child=new int[n];
for(i=0;i!=n;++i)
child[i]=i+1;
t=n;
j=1;
while(t>0)
{
for(i=0;i!=n;++i)
{
if(child[i]!=0)
{
if(j%3==0)
{
--t;
cout<<child[i]<<" ";
child[i]=0;
}
++j;
}
}
}
cout<<endl;
}
以3人,4人,5人为例,结果如下:





此题可用数学方法求解。

设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)

实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。

假设除去第k个人,则

0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1  // 原始序列 (1)

0, 1, 2, 3, ..., k-2, , k, ..., n-1   // 除去第k人,即除去序号为k-1的人 (2)

k, k+1, ..., n-1, 0, 1, ..., k-2  // 以序号k为起始,从k开始报0 (3)

0, 1, ..., n-k-1, n-k, n-k+1, ..., n-2  // 作编号转换,此时队列为n-1人  (4)

变换后就完完全全成为了(n-1)个人报数的子问题,注意(1)式和(4)式,是同一个问题,不同的仅仅是人数。比较(4)和(3),不难看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'后面的数字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2, 对于(3)式中'0'前面的数字,由于比n小,也可看作(0+k)%n=k, (1+k)%n=k+1, 故可得出规律:

设(3)中某一数为x' , (4)中对应的数为x,则有:x'=(x+k)%n.

设x为最终留下的人序号时,队列只剩下1人时,显然x=0; 此时可向前回溯至2人时x对应的序号,3人时x对应的序号……直至n人时x的序号,即为所求。

递归法表示如下:

#include using namespace std;const int m = 3;int main(){ int n,f=0; cin >> n; for (int i=2;i<=n;i++) f=(f+m)%i; cout <<f+1<<endl;}

C语言:有n个整型数围成一圈,求出相邻m个数之和的最小值。
答:int res=0; int i=0; scanf("%d %d",&n,&m); array=(int*)malloc(sizeof(int)* n); for(i=0;i<n;i++) scanf("%d",&array[i]); res=getMinSum(array,n,m); printf("\n%d",res);}int getMinSum(int *array,int n,int m){Link head,ptr1,ptr2,p;...

C语言:有五个小朋友围成一圈,编号为1到5,每人手里拿着一个数字,数字大...
答:int i,j,n;//n表示案例个数 int sum=0;//统计出局人数 int t=0;//计数器 int k;//数到k后出局 scanf("%d",&n);for (i=0;i<n;i++)for (j=0;j<5;j++)scanf("%d",&a[i][j]);//输入数据 //下面模拟该过程 for (i=0;i<n;i++){ k=a[i][0];//取第一个人...

c语言 贪心算法 小朋友分组 急急急急急急急 立刻!!!
答:{ int pmin, pmax, smin, smax, i;pmin = pmax = smin = smax = 0;for(i=0; i<n; i++){ if(a[i] < MinC)pmin += (MinC - a[i]);if(a[i] > MaxC)pmax += (a[i] - MaxC);smin += (a[i] - MinC);smax += (a[i] - MaxC);} if(pmin == ...

编写一个程序,输入N个学生的成绩,输出高于平均成绩的学生的学号和成绩...
答:float num[10];float count=0;float avg=0;for(int i=0;i<10;i++){ cout<<"第"<<i+1<<"个学生:";cin>>num[i];count=count+num[i];} //判断在平均分以上的同学 avg=count/i;cout<<"平均分为"<<avg<<endl;cout<<"输出高于平均分的学生"<<endl;for(i=0;i<10;i++){ i...

用C语言编写一个程序:
答:void main(){ int v1, v2, t, r, a;char op, ops[] = { '+', '-', '*', '/' };srand( (unsigned)time(NULL) ); //用当前时间初始化随机数种子 printf( "请答题 Ctrl+C 结束...\n" );while(1){ v1 = GEN_VALUE(); //随机生成第1个算数 v2 = GEN_VALUE();...

C语言编写一个程序,急用!!高分悬赏(正确答案追加分数)
答:flag = 1;} } } while(flag);} return 0;} void Menu(){ system("cls");printf("\t\t欢迎来到小学生算数训练\n");printf("\t\t\t1.加法训练\n");printf("\t\t\t2.减法训练\n");printf("\t\t\t3.乘法训练\n");printf("\t\t\t4.除法训练\n");printf("\t\t\t5.退出...

C语言问题,编写一个程序
答:printf("输入有误!\n");system("pause");exit(0);} else { sum=sum+score[i];if(score[i]==-1){ break;} } } num=i;printf("总共有%d个成绩成功输入\n",num);} void Comput(float score[MAX]){ for(int i=0;i<num;i++){ printf("第%d个学生的成绩为%.2f\n",i+1,...

用c语言编一个程序:有10个学生,每个学生的数据包括:学号、姓名、三门...
答:return(y[p-1]);} float f033(struct stu a[]){ float c,max=0;int i,j;for(i=0;i<10;i++)for(j=0;j<5;j++)if(a[i].score[j]>=max)max=a[i].score[j];for(i=0;i<10;i++)for(j=0;j<5;j++)if(a[i].score[j]==max)c=a[i].score[j];return(c);} i...

编写一个程序,输入n个学生的学号,姓名,3门课程的成绩,求出总分最高的...
答:printf("\n");count=0;while ((ch=='y') || (ch=='Y')){ stu[count]=input(); //调用录入信息函数 count++;printf("\n是否继续?(按Y继续,其它结束)");scanf(" %c",&ch);} printf("\n最高分为:");sort(stu,count); //调用排序函数 display(stu,1); //调用显示信息函数...