回 帖 发 新 帖 刷新版面

主题:[讨论]一道程序题

n个人围成一圈,按如下方式进行报数:(这里假设n=8)第1个人报数1;第2个人报数1,第3个人报数2;第4个人报数1,第5个人报数2,第6个人报数3;第7个人报数1,第8个人报数2,第1个人报数3,第2个人报数4。。
以下是我的程序#include<iostream>
using namespace std;
int main()
{
int m,n,a;
bool flag;
while(1)
{
cin>>n>>m;
if(n==0&&m==0)break;
a=0;flag=0;
for(int i=1;;i++)
{

  for(int j=1;j<=i;j++)
  { 
  a++;
  if(j==m){flag=1;break;}
  if(a==n)a=0;
  }
  if(flag)break;
  
    
      
        }
        cout<<a<<endl;
        }
        
          return 0;
}哪位高手有简便点的方法?

回复列表 (共5个回复)

沙发

C++的语言,却是面向过程的思维,厉害,你不如直接用C,执行速度还会更高效

板凳

int num;  //总人数
int p;    //第几个人
int n;    //报的数
int nloop;//报数的循环位置

scanf("%d",&num); //取得总人数
p=0;
n=0;
nloop=1;

while(1)         //不明白你这问题的循环退出条件是什么,自己在这里加上,不然就是个死循环
{
    printf("No.%d : %d\n",++p,++n);
    if(p==num) p=0;      //p%=num;//我觉得用比较可能会更好些,哪位大侠来解释下.
                        //if(!(n%=nloop)) nloop++;//如果用这行,就不用下面四行,但我觉得下面四行效率更高
    if(n==nloop)
    {
        n=0; nloop++;
    }
}

3 楼

while(1)
{
   printf("No.%d : %d\n",++p,++n);
   if(p==num) p=0;
   if(n==nloop)
   {
       n=0; nloop++;
   }
}
编译得到的汇编码,效率更高:
L2:
    leal    -12(%ebp), %eax
    incl    (%eax)
    movl    -12(%ebp), %eax
    movl    %eax, 8(%esp)
    leal    -8(%ebp), %eax
    incl    (%eax)
    movl    -8(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    $LC1, (%esp)
    call    _printf
    movl    -8(%ebp), %eax
    cmpl    -4(%ebp), %eax
    jne    L4
    movl    $0, -8(%ebp)
L4:
    movl    -12(%ebp), %eax
    cmpl    -16(%ebp), %eax
    jne    L2
    movl    $0, -12(%ebp)
    leal    -16(%ebp), %eax
    incl    (%eax)
    jmp    L2
-------------------------------------------------------
while(1)
{
   printf("No.%d : %d\n",++p,++n);
   p%=num;
   if(!(n%=nloop)) nloop++;
}
编译得到的汇编码,且不论idivl指令的复杂度如何,效率都相对要差点:
L2:
    leal    -12(%ebp), %eax
    incl    (%eax)
    movl    -12(%ebp), %eax
    movl    %eax, 8(%esp)
    leal    -8(%ebp), %eax
    incl    (%eax)
    movl    -8(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    $LC1, (%esp)
    call    _printf
    movl    -8(%ebp), %edx
    leal    -4(%ebp), %ecx
    movl    %ecx, -20(%ebp)
    movl    %edx, %eax
    movl    -20(%ebp), %ecx
    cltd
    idivl    (%ecx)
    movl    %edx, -8(%ebp)
    movl    -12(%ebp), %edx
    leal    -16(%ebp), %eax
    movl    %eax, -20(%ebp)
    movl    %edx, %eax
    movl    -20(%ebp), %ecx
    cltd
    idivl    (%ecx)
    movl    %edx, %eax
    movl    %eax, -12(%ebp)
    testl    %eax, %eax
    jne    L2
    leal    -16(%ebp), %eax
    incl    (%eax)
    jmp    L2

4 楼

#include<stdio.h>

int main(){
int mans = 8;
int i,thisnum=1,maxnum=1;

    for(i=1;i<=8;i++){
        printf("%d\n",thisnum++);
        if(thisnum>maxnum)maxnum++,thisnum=1;
    }

    getch();
    return 0;
}

5 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册