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