高手帮看一下,关于define定义整数的最大值

guoxingmu 2012-04-17 02:14:12
#include<iostream>
#include<time.h>
#include<stdlib.h>
#define max 8001
using namespace std;
typedef int elemtype;//用typedef 声明一个新的类型名以代替已有的类型,便于适应多种数据类型

int partition(elemtype A[],int p,int r);
void quicksort(elemtype A[],int p,int r)
{ int q;
if (p<r)
{
q=partition(A,p,r);//divide分解过程,quicksort的关键部分
//分解:数组A[p,r]被分成两个可能的数组A[p,q-1],A[q+1,r],是的前者中的数据元素都小于A[q],后者A[q+1,r]中的数据元素都小于A[q]
//是一个相对有序的数组
quicksort(A,p,q-1);//conquer(解决):通过递归调用快速排序,对于数组A[p.q-1]和A[q+1,r]排序
quicksort(A,q+1,r);
//combine(合并)因为数组是原地排序的,合并不需要操作
}
}
int partition(elemtype A[],int p,int r)//快速排序的关键
{
elemtype x=A[r];//把主元(pivot element)保存在x
elemtype temp;//暂存变量
int j;
int i=p-1;//为了后续的标号能对上,只是一个技巧,i代表小于A[q]的最后一个数在A中的位置
for(j=p;j<=r-1;j++)
{
if(A[j]<=x)//小于等于数轴元素才进行i加1,并且交换当前A[j]与大于数轴元素的第一个数据A[++i]
{
temp=A[++i];
A[i]=A[j];
A[j]=temp;

}

}
i++;

temp=A[r]; //把数轴元素与大于数轴元素的第一个数进行交换
A[r]=A[i];
A[i]=temp;

return i;

}
int main(void)
{ int i,j;
int p=0;
elemtype A[max];//在初始化数组时可以不指明数组的长度
srand((int)time(0));
A[0]=rand()%8000+1;
for(i=1;i<max;i++)
{
A[i]=rand()%8000+1;
for(j=0;j<i;j++)
{
if(A[i]==A[j])
i--;
}
}
int length = sizeof(A) / sizeof(int);//采用次公式计算数组的长度!!!实用!
int r=length-1;
quicksort(A,p,r);//初始时是对(A,P=0,r=length-1)
for(i=0;i<length;i++)
cout<<A[i]<<endl;
return 1;
}
这是一个快排的程序,程序是没有什么问题,只是在define宏定义时,若max小于等于8000则可以正确运行,若大于8000,则程序编译什么的窦娥米有问题,只是在运行时就没有任何动静了,就是无结果显示,这是为什么呢,望大侠帮忙解释一下,谢谢了!!!
...全文
966 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
evencoming 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:
引用 5 楼 的回复:
引用 3 楼 的回复:
for(i=1;i<max;i++)
{
A[i]=rand()%8000+1;
for(j=0;j<i;j++)
{
if(A[i]==A[j])
i--;
}
}
==》
for(i=1;i<max;i++)
{
A[i]=rand()%max+1;//改变 或者直接改为 A[i]=rand(……
[/Quote]
rand()*65536+rand().
这样就可以的。
比如 1<a<10. 1<10*a+a <100,就扩大范围了。
guoxingmu 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:
引用 3 楼 的回复:
for(i=1;i<max;i++)
{
A[i]=rand()%8000+1;
for(j=0;j<i;j++)
{
if(A[i]==A[j])
i--;
}
}
==》
for(i=1;i<max;i++)
{
A[i]=rand()%max+1;//改变 或者直接改为 A[i]=rand()*65535+rand(……
[/Quote]
呀,是32767,怪不得我定义40000是没有动静的。那这样的话,rand()/65536是否也不可以,最大应为32767?
evencoming 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:
for(i=1;i<max;i++)
{
A[i]=rand()%8000+1;
for(j=0;j<i;j++)
{
if(A[i]==A[j])
i--;
}
}
==》
for(i=1;i<max;i++)
{
A[i]=rand()%max+1;//改变 或者直接改为 A[i]=rand()*65535+rand()。,这样重复的可能性更低……
[/Quote]
随机数的大小也是有范围的。 你输出 RAND_MAX看看那个最大值是多少就知道了。
如果太大,也是很难产生一个新的不同的随机数,甚至比RAND_MAX更大了,就永远循环了。
所以像我那样改吧。
guoxingmu 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
for(i=1;i<max;i++)
{
A[i]=rand()%8000+1;
for(j=0;j<i;j++)
{
if(A[i]==A[j])
i--;
}
}
==》
for(i=1;i<max;i++)
{
A[i]=rand()%max+1;//改变 或者直接改为 A[i]=rand()*65535+rand()。,这样重复的可能性更低了。
for(j=0;……
[/Quote]
是的,我也发现了,您能帮我解答一下我问2楼的问题吗,谢谢,呵呵
guoxingmu 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
把你直接写成8000的地方都改为max吧
[/Quote]
那我都改为max以后,出现了这个问题,在max小于等于30000时,是运行的,但当我把max定为40000时,运行时又不动了,好像一直在产生随机数,没到排序那一步就,这个有什么说法吗,该怎么解释?谢谢
evencoming 2012-04-17
  • 打赏
  • 举报
回复
for(i=1;i<max;i++)
{
A[i]=rand()%8000+1;
for(j=0;j<i;j++)
{
if(A[i]==A[j])
i--;
}
}
==》
for(i=1;i<max;i++)
{
A[i]=rand()%max+1;//改变 或者直接改为 A[i]=rand()*65535+rand()。,这样重复的可能性更低了。
for(j=0;j<i;j++)
{
if(A[i]==A[j])
i--;
}
}

这里改改,大于 8000你这里就是死循环了。。
因为这里是为了防止重复的,可是 8000个以上的数字,但是每个数字在 1~8000直接,则必然有重复
所以,死循环
Coder_Y_Jao 2012-04-17
  • 打赏
  • 举报
回复
把你直接写成8000的地方都改为max吧
Coder_Y_Jao 2012-04-17
  • 打赏
  • 举报
回复
你main函数的这里把8000给定死了,所以max8000超过就出问题了。

srand((int)time(0));
A[0]=rand()%8000+1;
for(i=1;i<max;i++)
{
A[i]=rand()%8000+1;

70,017

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧