我的老师让我创建一个将执行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,但我认为您想将"或"更改为"||"