c语言 - 如何创建一个带有随机数 >100000 的循环 1M



我的老师让我创建一个将执行1M次的循环。我尝试了for(long i=0;i<1000000;i++),但程序崩溃了。程序接受的最大数量为 10.000。

有什么想法吗?这可能吗?

他还要求我创建一个随机数>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 secondsn", elapsed_time );
system("pause");

这是 gcd:

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;
    }
}

有一个从 0 到 1000000 的循环并没有错。程序崩溃的原因是您在程序中执行的其他操作。

尝试以下操作之一:

  • 单步执行调试器中的代码以查找崩溃的行。
  • 注释掉循环中(及其之后)的行,直到它运行。然后逐一取消注释以追踪罪魁祸首。

我看到了一件可疑的事情:elapsed_time声明为什么类型?你正在对它做看起来像整数(或四字整数?)的数学运算,然后你告诉printf把它打印为浮点数。 printf不会为您或任何事情进行智能类型转换。如果你给它喂了一个错误类型的变量,你很容易得到垃圾或崩溃。

in gcd

您有一个额外的紧密支架

如果 x == y,则 z 是未定义的;所以坏事可能会发生

尝试将循环作为

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。

使用longs来循环更长的范围:

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

对于大型随机,您可以将 rand() 的返回转换为 long 并将 2 相乘或类似的东西。 (呵呵,这个答案大概是我的年龄...当我经常编写 C 代码时,int 只有 16 位。;)

在此语句中

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

我的编译器I(llvm-gcc-4.2)不会编译它。 我只是在学习 c,但我认为您想将"或"更改为"||"

最新更新