C++ 在不占用太多时间/内存的情况下保存未知数量的整数 #包括 使用名称空间std; 无符号长除法和(无符号长x); int main() { 无符号长x; cin>>x; 无符号长y[200000]; for(无符号整数i=0;i>y[i]; for(无符号整数i=0;ix; 无符号长*y=新的无符号长[x]; //您可以检查new是否未在此处引发异常 for(无符号整数i=0;i>y[i]; for(无符号整数i=0;i
由于您知道数组的大小,请尝试C++ 在不占用太多时间/内存的情况下保存未知数量的整数 #包括 使用名称空间std; 无符号长除法和(无符号长x); int main() { 无符号长x; cin>>x; 无符号长y[200000]; for(无符号整数i=0;i>y[i]; for(无符号整数i=0;ix; 无符号长*y=新的无符号长[x]; //您可以检查new是否未在此处引发异常 for(无符号整数i=0;i>y[i]; for(无符号整数i=0;i,c++,arrays,memory,C++,Arrays,Memory,由于您知道数组的大小,请尝试vector和reserve #include <iostream> using namespace std; unsigned long long divsum(unsigned long long x); int main() { unsigned long long x; cin >> x; unsigned long long y[200000]; for (unsigned int i = 0;
vector
和reserve
#include <iostream>
using namespace std;
unsigned long long divsum(unsigned long long x);
int main()
{
unsigned long long x;
cin >> x;
unsigned long long y[200000];
for (unsigned int i = 0; i < x; i++)
cin >> y[i];
for (unsigned int i = 0; i < x; i++){
cout << divsum(y[i]) << endl;
}
return 0;
}
unsigned long long divsum(unsigned long long x){
int sum = 0;
for(unsigned int i = 1; i <= x/2; i++){
if(x % i == 0)
sum += i;
}
return sum;
}
您可以动态分配阵列,因此在
x<200000
const unsigned long long & divsum(const unsigned long long & x){
int sum = 0;
unsigned long long x2 = x/2
for(unsigned int i = 1; i <= x2; i++){
if(x % i == 0)
sum += i;
}
return sum;
}
intmain()
{
无符号长x;
cin>>x;
无符号长*y=新的无符号长[x];
//您可以检查new是否未在此处引发异常
for(无符号整数i=0;i>y[i];
for(无符号整数i=0;i 您是否应该告诉算法应该做什么,以便为您提供更好的实现方法…一个简单的std::transform
调用应该可以很好地工作。当然,它也不会有副作用,因此它可能不取决于您如何定义divsum
。如果您的解决方案超过了时间,问题通常在于t的复杂性该算法不在使用的内存中。但是,您可以使用std::vector y(x)
来减少内存使用。您正在堆栈上分配1.5Mb数组-它可能很长,并且可能会崩溃。您可能还应该注意,对于2000000(两百万)个案例和200000(二十万)个数组元素,如果x
超过了数组大小,那么您就可以调用未定义的行为了(而且您根本不需要数组,所以我不知道您希望从中获得什么).如果练习要求在输出之前必须读取stdin中的所有输入,该怎么办?我知道这是可能的,但程序要求先输入所有数字,然后输出结果。好的。让我编辑它,以便根据要求给出更好的答案为什么我们必须使用&这里?对不起,如果这是一个noob问题,我仍然是一个beginner with pointers。&在这里的声明中,意味着我声明的是引用,而不是指针。引用指向传递的同一对象,避免了一个副本。因此,在上面的代码中,您避免了另一个long
Quick overview:动态内存中的数组如何比堆栈或globa中的数组工作得更好l内存?除非动态内存被分页到磁盘或其他地方,否则所有的都应该有相同的寻址方案。@ThomasMatthews程序每次运行时都会分配一个200000个元素的数组。这意味着即使x小于200000,它仍然会分配比它需要的更多的内存,并且它会花费时间去做这些。@Nazar554这就是字面上的意思s只不过是更改子esp,N
指令中N的大小。它对计时没有任何影响。但是,它可能对堆栈溢出产生重大影响。
const unsigned long long & divsum(const unsigned long long & x){
int sum = 0;
unsigned long long x2 = x/2
for(unsigned int i = 1; i <= x2; i++){
if(x % i == 0)
sum += i;
}
return sum;
}
int main()
{
unsigned long long x;
cin >> x;
unsigned long long *y = new unsigned long long[x];
// you can check if new didn't throw an exception here
for (unsigned int i = 0; i < x; i++)
cin >> y[i];
for (unsigned int i = 0; i < x; i++){
cout << divsum(y[i]) << endl;
}
delete[] y;
return 0;
}