主题:[讨论]一道程序题
hfxl1108
[专家分:0] 发布于 2009-03-27 22:51:00
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个回复)
沙发
Hawkxp [专家分:350] 发布于 2009-04-21 22:42:00
C++的语言,却是面向过程的思维,厉害,你不如直接用C,执行速度还会更高效
板凳
Hawkxp [专家分:350] 发布于 2009-04-22 07:57:00
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 楼
Hawkxp [专家分:350] 发布于 2009-04-22 08:37:00
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 楼
imjohnzj [专家分:1490] 发布于 2009-04-22 11:06:00
#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 楼
moke9 [专家分:30] 发布于 2010-09-02 07:41:00
你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846
我来回复