主题:求帮我看下哪里问题!
63755095
[专家分:0] 发布于 2010-08-06 14:09:00
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int falg=1,t;
int a[6];
while(falg!=0)
{
srand((int)time(0));
for(int i=0;i<6;i++)
a[i]=rand()%100+1;
for(int i=1;i<6;i++)
for(int j=0;j<6-i;j++)
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
for(int i=0;i<5;i++)
if(a[i]==a[i+1])falg++;//这里好像没有执行
else falg=0;
}
for(int i=0;i<6;i++)
cout<<a[i]<<'\t';
system("PAUSE");
return EXIT_SUCCESS;
}
题目是随即写出6个不重复的数 我这里还是会出现重复的为什么啊 ?
回复列表 (共9个回复)
沙发
yxqyrh [专家分:1070] 发布于 2010-08-06 15:49:00
单步调试,这么简单的问题,你咋写那么多重循环?
板凳
耶路撒冷 [专家分:650] 发布于 2010-08-07 00:01:00
你不包含ctime吗
3 楼
63755095 [专家分:0] 发布于 2010-08-08 10:24:00
if(a[i]==a[i+1])falg++;//这里好像没有执行
感觉就这里没有执行啊
4 楼
eastcowboy [专家分:25370] 发布于 2010-08-08 11:56:00
“感觉没有执行”,您可以自己验证一下。在那里设置断点,或者添加一条printf语句,看看是否真的执行了。
[quote] for(int i=1;i<6;i++)
for(int j=0;j<6-i;j++)
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
for(int i=0;i<5;i++)
if(a[i]==a[i+1])falg++;//这里好像没有执行
else falg=0;[/quote]
初看过去,似乎是三层循环,其实不是。注意第三个for并不是在第二个for语句的内部。
养成加括号的习惯,可以回避这些问题。
5 楼
Screenager [专家分:840] 发布于 2010-08-08 21:56:00
for(int i=0;i<5;i++)
if(a[i]==a[i+1])falg++;//这里好像没有执行
else falg=0;
这只能检查最后两个数,如果最后两数相等则重新产生随机数,否则输出六个数。可是前面5个数存在相等呢?
是不是改成:
for(int i=0;i<5;i++)
if(a[i]==a[i+1]){
falg++;
break;
}
else falg=0;
6 楼
Screenager [专家分:840] 发布于 2010-08-08 22:43:00
lz的这种算法效率太低,不如这样:
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
int t;
vector<int>a;
srand(time(0));
a.push_back(rand()%100+1);
for(int i=0;i<5;i++){
t=rand()%100+1;
while(find(a.begin(),a.end(),t)!=a.end())
t=rand()%100+1;
a.push_back(t);
}
for(int i=0;i<6;i++)
cout<<a[i]<<"\t";
cout << endl;
return 0;
}
7 楼
63755095 [专家分:0] 发布于 2010-08-10 09:07:00
楼上的好像是运用了stl的吧 这个我才刚刚开始看 我是新手 !书看起来有点困难毛 更别说运用了呵呵 ,不过我还是会坚持的! 我的这种算法是很低的 程序运行起来有时候很慢的
8 楼
63755095 [专家分:0] 发布于 2010-08-10 09:21:00
[quote]for(int i=0;i<5;i++)
if(a[i]==a[i+1])falg++;//这里好像没有执行
else falg=0;
这只能检查最后两个数,如果最后两数相等则重新产生随机数,否则输出六个数。可是前面5个数存在相等呢?
是不是改成:
for(int i=0;i<5;i++)
if(a[i]==a[i+1]){
falg++;
break;
}
else falg=0;[/quote]
for(int i=0;i<5;i++)
if(a[i]==a[i+1])falg++;//这里好像没有执行
else falg=0;
这个为什么只能是检查最后2个呢?我不是用循环了吗?检查的是从a[0]==a[1]开始到最后的 然后其中有相等的就falg=0; 我的想法是这样子的 呵呵 !帮我解答下疑问谢谢
9 楼
Screenager [专家分:840] 发布于 2010-08-11 08:30:00
一发现有两数相等时你就应该停止循环,也就是需要加一个break,此时flag!=0,如果不用break停止,它将继续检查后面的数,flag最终的值只能由最后两数确定。
我来回复