c程序的一道题,同一题两个编程软件运行不一样~那么奇怪~帮帮忙找下原因~
题目是:有 n 人围成一圆圈,分别编号 1 —— n ,从第 1 人开始从 1 到 m 循环报数,凡是报到 m 者离开圆圈,求 n 个人离开圆圈的次序
我写的代码是:
#include<stdio.h>
#include<math.h>
#define n 6 /*输入人数n,循环报数m*/
#define m 3
void main()
{int a[n]={0},t,i,flag;
for(t=0,i=1,flag=1;flag<= n;) /*控制输出数flag,大于人数n时停止循环*/
{
if(i>n) /*利用绝对值|n-i|使i值超过人数n时,i从头开始数*/
i=fabs(n-i);
while(a[i]==1) /*若此人被标记,
跳向下一个人*/
{i++;
if(i>n) /*若i超过人数值,使i从头开始数过*/
i=fabs(n-i);
}
t++; /*报数*/
if(t<m) /*t小于m时,i加1,即跳向下一个人*/
{i++;
continue;
}
printf("\n "); /*若上面的t大于或等于m时就输出i值,即输出被点到的人*/
printf("%d ",i);
a[i]=1; /*标记此人*/
t=0; /*报数清0*/
flag++;
}
}
以上代码在turbo C3.0和VC6.0运行答案分别是3 6 4 1 6 6 & 3 6 4 2 5 1 vc6.0运行的是正确答案,但在编译中有这样一段话:warning C4244: '=' : conversion from 'double' to 'int', possible loss of data
奇怪,我的代码有问题吗??????谁能看的出来?我找半天找不到~
正确答案者明是:3 6 4 2 5 1(经验证) (其实很仔细分析下酒知道3 6 4 1 6 6 答案有问题)
另外,早嫌御fabs的函数原型是:double fabs( double x );
造成warning的原因是将fabs返回的浮点型赋值给整形的i。
程序逻辑没有问题,建议你将turbo上的程序检查下,看看陆岩在两个编译器上运行的程序相同!
答案3 6 4 1 6 6 肯定不对,因携羡坦为第6个人已经离开圆圈,后面再出现6肯定不对了。
你的代码有问题。你单步辩桐跟踪调试一下看看我说的对不对。
第一次数到3的是第3个人,第二次数到3的是第6个人. 这个时候,你的代码里变量 i=6,那么
a[i]=1; /*标记此人*/
这派隐句话就出错了,数组已经越界了。
fabs为求浮点数类型的绝对值,而你定义的类型为int型,用abs吧。因为用了fabs所以才会出现conversion from 'double' to 'int'。因为这是个不完全的转换。锋游至于为什么两个会出现不同的答案,原因在于两款编译器对于double转int的数据处理方法不腊基晌同。你用abs()求整型的绝对值吧。
具体的fabs与abs的差别自轮锋己看一下百度知道吧。
警告的意思是等号把double的数赋值给了整形,可能会丢失精度,可能这里出的问题 i=fabs(n-i);你查查看fabs是否返回一个double的数弯如
其实你的全部数坦罩都是整埋信启形的运算,所以没有什么问题的,PS你的代码逻辑是没有问题的