2011-05-16 66 views
-1

我的老师让我创建一个将被执行1M次的循环。我试过,但程序崩溃了。程序接受的最大数量是10.000。如何用随机数字创建一个循环1M> 100000

任何想法?这可能吗?

他还要求我创建一个大于100.000的随机数。我正在使用rand();。我应该使用不同的方法吗?

这是代码:

start_time = clock(); 
for(long i=0;i<1000000;i++){ 
    num1 = rand(); 
    num2=rand(); 
    gcd1(num1,num2); 
} 

end_time = clock(); 

elapsed_time = (end_time - start_time)/CLOCKS_PER_SEC; 

printf("time is %.3f seconds\n", elapsed_time); 
system("pause"); 

这最大公约数:

int gcd1(int x, int y){ 
    int z; 
    if (x<y) 
     z=x+1; 
    else if (y<x) 
     z=y+1; 
    do{ 
     z=z-1; 
    } 
    while((x%z!=0) or (y%z!=0)); 
     return z; 
    } 
} 
+3

我来划分刚刚为您创建了一个随机数:100001. – hirschhornsalz 2011-05-16 20:47:53

+0

什么是“1M次”?一千?一百万?一毫秒?此外,你真的应该发布崩溃的代码。如果没有来自循环内容的帮助,你给出的循环可能不会崩溃。 – 2011-05-16 20:49:25

+0

应标记作业。 – 2011-05-16 20:49:50

回答

0

试试你的环路

for (i = 0; i < 1000000; i++) { 
    do num1 = rand(); while (num1 == 0); 
    do num2 = rand(); while (num2 == 0); 
    gcd1(num1, num2); 
} 

rand()可以返回0。当它是(在超过10000个环路),你的程序将设置z为0,并试图通过0

1

有什么不妥具有从0至1000000你的程序崩溃的原因是一个循环你在程序中做的其他事情。

0

使用多头,遍历更远的距离:

for (long i = 0; i < 1000000L; i++) { 
    //do something 
} 

大型随机量,你可以施放兰特()长的回报,乘两个在一起或者类似的东西。 (嘿,可能显示在我的年龄由这个答案......回来时,我经常被编码C,INT仅为16位。)

+1

......我们很高兴拥有这些16位! – 2011-05-16 20:58:21

1

请尝试以下之一:

  • 步骤通过代码调试器来查找哪条线路崩溃。
  • 注释掉循环中的行(以及之后)直到它运行。然后逐个取消注释,追查罪魁祸首。

我从蝙蝠身上看到的一件可疑物:elapsed_time是什么类型的声明?你正在做什么看起来像整数(或四字整数?)数学,然后你告诉printf打印它作为一个浮点数。 printf不会为您或任何其他类型的智能类型转换。如果你给它一个错误类型的变量,你很可能会得到垃圾或崩溃。

+0

好的,我做到了。 num1和num2 = rand();正在崩溃的循环。 – user622203 2011-05-16 22:22:42

+0

@ user622203 - 为了仔细检查,尝试注释掉gcd1()调用并取消注释这两个rand()调用。有时一个例程可以模拟堆栈,直到下一个函数被调用时才会看到问题。 – 2011-05-17 13:31:29

1
在GCD

你有一个额外的右括号

如果x == y,则z为不确定的;如此糟糕的事情可能发生

0

在这份声明中

while((x%z!=0) or (y%z!=0)); 

我的编译器我(LLVM-GCC-4.2)将不会编译它。我只是在学C,但我认为你想把“或”改成“||”