1编写函数求:1-1/2+1/3-1/4+....+1/n C++

2设计函数Fri(int M,int n),功能是将M个人围成一圈,编号为1—M,从第1号开始报数,报到n的倍数的人离开,一直数下去,直到最后只剩下1人。求此人的编号。

第二道题是约瑟夫环问题,我之前做过,先给你贴上。第一道题等等给你做。

#include <stdio.h>
#include <stdlib.h>
#define N 100
void Fri(int M,int n){
int count=0;//计数器
int i=0;//控制循环的变量
int p=0;//出场后玩家的人数(每局一个玩家出场)
int a[N]={0};//将储存玩家名称的数组初始化为0
for(i=0;i<M;i++)//从1开始依次为每个玩家命名(赋值)
{
a[i]=i+1;
}
p=M;//初始条件为参与人数为p
while(p>1)//当p大于1人时就进行游戏
{
for(i=0;i<M;i++)//从第i个玩家开始数
{
if(-1!=a[i])//如果第i个玩家的名称没有被修改为-1,证明他还在游戏中,
count++; //数一下他
if(n==count)//如果数到N的倍数
{
//printf("%d\t",a[i]);//加上此句可以看出出场的顺序
a[i]=-1;//将名称标记为1,即出局
count=0;//计数器归零
p--;//参与游戏的玩家数-1
}
}
}
for(i=0;i<n;i++)//当只剩余1名玩家时,查找到唯一没有标记为1的玩家,并且将其打印
{
if(-1!=a[i])
printf("%d",a[i]);
}
}
int main()
{
Fri(10,3);
return 0;
}追问

用c++做不是C 第一题我做好了

追答

稍微改了一下
#include
#define N 100
using namespace std;
void Fri(int M,int n){
int count=0;//计数器
int i=0;//控制循环的变量
int p=0;//出场后玩家的人数(每局一个玩家出场)
int a[N]={0};//将储存玩家名称的数组初始化为0
for(i=0;i1)//当p大于1人时就进行游戏
{
for(i=0;i<M;i++)//从第i个玩家开始数
{
if(-1!=a[i])//如果第i个玩家的名称没有被修改为-1,证明他还在游戏中,
count++; //数一下他
if(n==count)//如果数到N的倍数
{
cout<<a[i]<<"\t";//加上此句可以看出出场的顺序
a[i]=-1;//将名称标记为1,即出局
count=0;//计数器归零
p--;//参与游戏的玩家数-1
}
}
}
for(i=0;i<n;i++)//当只剩余1名玩家时,查找到唯一没有标记为1的玩家,并且将其打印
{
if(-1!=a[i])
cout<<a[i];
}
}
int main()
{
Fri(10,3);
return 0;
}

追问

M也从键盘输入

追答

#include
#define N 100
using namespace std;
void Fri(int M,int n){
int count=0;//计数器
int i=0;//控制循环的变量
int p=0;//出场后玩家的人数(每局一个玩家出场)
int a[N]={0};//将储存玩家名称的数组初始化为0
for(i=0;i1)//当p大于1人时就进行游戏
{
for(i=0;i>M;
cout>n;
Fri(M,n);
return 0;
}

追问

#define N 100 是起什么作用?

追答

因为M是变量,变量是不能作为数组长度的,所以就给数组一个初始值N=100,也就是最多100个人游戏,要是最多一万个人,就改为#define N 10000.

追问

但是如果M>N怎么破?

追答

不好意思,程序有点小bug,已经修正

#include
#define N 100
using namespace std;
void Fri(int M,int n){
int count=0;//计数器
int i=0;//控制循环的变量
int p=0;//出场后玩家的人数(每局一个玩家出场)
int a[N]={0};//将储存玩家名称的数组初始化为0
for(i=0;i1)//当p大于1人时就进行游戏
{
for(i=0;i>M;
cout>n;
Fri(M,n);
return 0;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-07

1

#include<iostream>

using namespace std;

int main()

{

  int n;

  double total;

  cout<<"input the the n: "<<endl;

  cin>>n;

  int i=0;

  for(i=0;i<n;i++)

  {

     double flag;

     if(i%2==0)

     {

       flag=1;

     }

     else

     {

     flag=-1;

     }


     total+=(flag)/(i+1);


  }

  cout<<"total is: "<<total<<endl;

}


2


#include<iostream>
using namespace std;
struct person     //定义结构体
{ int data;                              
 person *next;
};

class josering  //定义约瑟夫类                        
{
public:
   josering(int x , int y );            
   void getdata();                      
private:
   person *front;                    
   int n ;
   int m ;
};

josering::josering(int x,int y)   //构造循环链表      

{
  n=x;
  m=y;
  person *p,*rear;  
  for(int i=1;i<=n;i++)
  {
       p=new person;
       p->data=i;
       if(i==1)      //当只有一个数据时,头指针和尾指针都指向第一个元素                    
{
           front=p;
           rear=p;
}  
       else                            
{
           rear->next=p; //为指针随着数据往后移动
           rear=p;    
}
  }
  rear->next=front;                    
}

void josering::getdata()  //获取出列的人的编号
{  
    person *p1,*p2,*p;
    p1=front;
    for(int i=1;i<n;i++)          
{
        int counter=1;                                          
        while(counter++<m)            
{
           p2=p1;
           p1=p1->next;
}
           p=p1;                    
cout<<"第"<<i<<"次出列的人的编号为:"<<p->data<<endl;
       p2->next=p1->next;        
           p1=p1->next;            
           delete p;                
} cout<<"最后一个出列的人的编号为:"<<p1->data<<endl;
}

void main()
{

    int n,m;
cout<<"请输入总人数:";
cin>>n;
while (n<1)
{
     cout<<"n值错误,请重新输入:";
  cin>>n;
}
cout<<"请输入m值:";
    cin>>m;
    while (m<1)
{
     cout<<"m值错误,请重新输入:";
  cin>>m;
}
    josering test(n,m); //定义对象检测程序
    test.getdata();
}                  
这个可以吧











第2个回答  2013-10-07
#include <iostream>
using namespace std;
struct Node
{
int date;
Node *next;
};
Node *p,*head;
void Fri(int M,int n)
{
Node* start=head;  //游戏开始位置
int cnt=0;//计数用的
int count=0;
while(1)    //将链表头尾相连成约瑟夫环
{
if(p->next==NULL)
{
p->next=head;
break;
}
else
p=p->next;
}  
for(Node* tmp=head;cnt<M;tmp=tmp->next)
{
start=tmp;
cnt++;
}
cnt=0;
if(n==1)            //判断离开,删除离开成员的指针
{
cout<<"留下来的为编号:"<<M<<endl;
return;
}
else
{
cnt=1;
while(1)
{
cnt++;
if(cnt==n)
{
count++;
if(count==M)
{
cout<<"留下来的为编号:"<<start->next->next->date<<endl;
return;
}
start->next->next=start->next->next->next;
cnt=1;
}
start=start->next;
}
}
}
int main()
{
p=new Node;
head=p;
int n,m;
cout<<"请输入人数M:";
cin>>n;
cout<<"请输入倍数n:";
cin>>m;
for(int i=1;i<=n;i++)
{
p->date=i;
if(i<n)
{
p->next=new Node;
p=p->next;
}
if(i==n)
p->next=NULL;
}
Fri(n,m);
return 0;
}
满意请采纳哦!

1编写函数求:1-1\/2+1\/3-1\/4+...+1\/n C++
int count=0;\/\/计数器 int i=0;\/\/控制循环的变量 int p=0;\/\/出场后玩家的人数(每局一个玩家出场)int a[N]={0};\/\/将储存玩家名称的数组初始化为0 for(i=0;i<M;i++)\/\/从1开始依次为每个玩家命名(赋值){ a[i]=i+1;} p=M;\/\/初始条件为参与人数为p while(p>1)\/\/当p大...

用C++编写程序函数求表达式1-1\/2+1\/3-1\/4+1\/5-1\/6+1\/7-...+1\/n的值
int k = 1;for(int i = 1; i <= n; i++){ sum += (1.0\/double(i))*k;k = k*(-1);} return sum;}

编写程序,求1-1\/2+1\/3-1\/4+1\/5……+1\/n
C++版本 double fun(int n){ double sign=1;double sum=0;for(int i=1;i<=n;i++){ sum+=sign\/i;sign*=-1;} return sum;} 大概就是这样

C++:数列求和:1-1\/2+1\/3-1\/4……1\/n
\/\/#include "stdafx.h"\/\/vc++6.0加上这一行.#include <iostream>using namespace std;int main(void){\/\/1-1\/2+1\/3-1\/4……1\/n int i,n; double sum; cout << "Input n(>0 int):\\nn="; cin >> n; for(sum=0,i=1;i<=n;sum += i&1 ? 1.0\/i+...

C++计算式子(n!是指n的阶乘) 1-1\/2!+1\/3!-1\/4!+...-1\/n! 我不知道该...
比如n=3,就计算1-1\/2!+1\/3!cin>>maxn;for(i=1;i<=maxn;i++){ n=n*i;if(i%2==0)n=-n;\/\/偶数项为负值 t=1\/n;sum=sum+t;if(n<0)n=-n;\/\/把n变回正数 } cout<<"1-1\/2!+1\/3!-1\/4!+...="<<sum<<endl;}\/\/试验过了,不懂可追问 ...

C语言编程,s=1+1\/2-1\/3+1\/4-1\/5...+1\/n,
i%2!=0) \/\/这里应该是ij=-j;s+=j;}printf("%lf\\n",s); \/\/double用%lf long float}void main(){int n;double s=1;printf("N:");scanf("%d",&n);if(n==1) \/\/==比较用等号printf("%lf\\n",s); \/\/elsefun(n); \/\/传参,没有返回值!\/\/s=fun();} ...

c++程序设计设s=1+1\/2+1\/3+...+1\/n,求与八最接近的s的值与其对应的n值...
取小者(相等时取前一项)的最后一项的n便是题解。代码如下:include "stdio.h"int main(int argc,char *argv[]){int n;double s;s=n=0;do{s+=1.0\/++n;}while(s<8);if(s-8 > 8-s+1.0\/n)s-=1.0\/n--;printf("s = %f\\tn = %d\\n",s,n);return 0;}运行结果如下:...

C语言题求 s=1\/1!-1\/2!+1\/3!-1\/4!+……+1\/n!的解答过程?高手快来啊...
s=1\/1!-1\/2!+1\/3!-1\/4!+……+1\/n!\/ int _tmain(int argc, _TCHAR* argv[]){ int fact(int n);int n;double total=0;cout<<"输入n:";cin>>n;for (int i=1;i<=n;i++){ if (i%2!=0)total+=1\/(double)fact(i);else total-=1\/(double)fact(i);} cout<<"...

(c++)多项式的描述如下:1 - 1\/2 + 1\/3 - 1\/4 + 1\/5 - 1\/6 + ...现 ...
n小于1000精度应该还行,直接暴力吧 double ans = 1.000;for(int i = 2; i <= n; i++){ if(i % 2 == 0) ans -= 1\/i; else ans += 1\/i;}最后的ans就是结果

用C++编写程序,计算s=1-1\/2+1\/4-1\/6+……-1\/98+1\/100?
以下是用C++编写的计算程序:include<iostream> include<cmath> using namespace std;int main(){ double s = 0.0;for(int i = 1; i <= 100; i++){ if(i % 2 == 1) \/\/奇数项 { s += 1.0 \/ i;} else \/\/偶数项 { s -= 1.0 \/ i;} } cout << "s = " << s ...

相似回答