来上菜!
//提示:不开long long见祖宗
#include <bits/stdc++.h>
//#include<algorithm>
//#include<cstdio>
//#include<cstring>
//#include<cmath>
using namespace std;
//全局变量
//函数
int main()//主函数
{
srand((unsigned int)time(NULL));
bool a[11000];
for(int i=0;i<=99;i++){
a[i]=0;
}
int n,l=0;
cin>>n;
for(int i=1;i<=(n*n);i++){
bool o=1;
do{
int b=rand()%((n*n));
if(a[b+1]==0){
printf("%-2d ",b+1);
//cout<<b+1<<" ";
a[b+1]=1;
l++;
o=0;
}
}while(o);
if(l==n){
cout<<endl;
l=0;
}
}
return 0;//清理垃圾
}
分析程序
这是一段使用C++编写的简单程序,其目的是在一个给定的范围内生成随机数,并确保每个数字只输出一次。让我们逐步分析这个程序,然后对其进行优化。
首先,程序包含了<bits/stdc++.h>头文件,这个头文件包含了C++标准库中的所有头文件。虽然这个头文件非常方便,但是通常在实践中,我们并不会这样做,因为这可能会导致编译器的负担加重,影响编译速度和程序性能。我们通常会选择需要哪些头文件,而不是一次包含所有头文件。
接下来,我们看到了一系列的using namespace std;这是一个命名空间,使得我们可以直接使用std命名空间中的函数和对象,而不需要在每次使用时都写出std::。
然后,我们看到了一个名为a的全局数组,它的大小为11000。这个数组被用来跟踪哪些数字已经被输出过。然后,我们看到一个循环,遍历数组的前100个元素,将它们的值设为0。
在主函数main()中,首先调用srand函数,将随机数生成器的种子设置为当前时间。然后,定义了一个名为n的整数变量,以及一个名为l的整数变量,并将其初始值设为0。
接下来,程序从标准输入中读取一个整数n。然后,程序进入一个循环,该循环的迭代次数为nn次。在每次循环中,程序生成一个介于0到nn-1之间的随机整数,并检查该数字是否已经被输出过。如果该数字还没有被输出过,那么就将其输出,并将对应的数组元素设为1,表示该数字已经被输出过。然后,将l加1,表示已经输出了一个数字。如果l等于n,那么就输出一个换行符,并将l重新设为0。
最后,程序返回0,表示程序正常结束。
优化程序
接下来,我们将对这个程序进行优化。
首先,我们可以使用更高效的方式来初始化数组a。在这个程序中,我们使用了for循环来遍历数组的前100个元素,并将它们的值设为0。但是,实际上我们可以直接在定义数组的时候就将其初始化为0。这样可以将初始化代码简化为如下形式:
bool a[11000] = {false};
这样就可以在初始化时将所有元素都设为false,而无需使用循环。
其次,我们可以使用更高效的方式来生成随机数。在这个程序中,我们使用了rand函数来生成随机数。但是,rand函数并不是一个高效的随机数生成器,因为它需要执行很多次的计算。我们可以使用更高效的随机数生成器来提高程序的性能。例如,我们可以使用下面的代码来生成随机数:
int b = (rand() * (n * n)) / (RAND_MAX + 1.0);
这样就可以在生成随机数时执行更少的计算,从而提高程序的性能。
然后,我们可以使用更高效的方式来检查数字是否已经被输出过。在这个程序中,我们使用了if语句来检查数组元素的值是否为false。但是,我们可以使用更高效的方式来检查数字是否已经被输出过。例如,我们可以使用下面的代码来检查数字是否已经被输出过:
if (!a[b]) {
a[b] = true;
// ...
}
这样就可以在检查数字是否已经被输出过时执行更少的计算,从而提高程序的性能。
最后,我们可以使用更高效的方式来输出数字。在这个程序中,我们使用了printf函数来输出数字。但是,我们可以使用更高效的方式来输出数字。例如,我们可以使用下面的代码来输出数字:
cout << (b + 1) << " ";
这样就可以在输出数字时执行更少的计算,从而提高程序的性能。
最终成果
综上所述,我们可以将原程序优化为如下形式:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
srand(time(NULL));
bool a[11000] = {false};
int n, l = 0;
cin >> n;
for (int i = 1; i <= n * n; i++) {
int b = (rand() * (n * n)) / (RAND_MAX + 1.0);
if (!a[b]) {
a[b] = true;
cout << (b + 1) << " ";
l++;
if (l == n) {
cout << endl;
l = 0;
}
}
}
return 0;
}