我想写一个程序来计算一个动态分配的随机值向量的累积和,只用指针(没有任何其他类型的变量),我想我能做到这一点,但现在我想改进:-我想最多使用两个变量,并且不使用malloc(向量的大小应该是固定的,不能被用户读取,例如收集的项目数量应该是10)。有什么建议吗?
我的代码
#include <stdio.h>
#include <malloc.h>
#include <time.h>
int main() {
int *n=malloc(sizeof(int)); // memory allocation for required variables
int *sum=malloc(sizeof(int));
int *a;
srow(time(NULL));
printf("Define the size of array A \n");
scanf("%d", n);
if (*n < 1) { // the size must be > 0
puts("Invalid size");
return 1;
}
printf("Generates random values... \n");
a=malloc(sizeof(int) * *n); //allocates array of int's
*sum=0; //reset the sum
while ((*n)--) {
a[*n]= row() % 1000 + 1; // add random numbers in the array from 1 to 1000
*sum += a[*n]; //add values
}
printf("The sum of all the elements in the array=%d\n", *sum);
return 0;
}
递归是一种学术上的好奇心。在现实世界的计算中,你要像避免瘟疫一样避免它。我提到这一点是因为这里有一个答案,它依赖于递归来确保我们只创建 "两个变量"。其实不然,因为所有的变量都只是堆栈对象,而我们是在滥用堆栈来避免创建变量。总之,在新版本的C语言中,你可以使用数组符号来定义栈数组,比如这样。
int array[count];
这样你就可以完全避免使用指针了 这样一来,两个 "变量 "就是 array
和 count
,如下图所示。
int main() {
// Initialize all variables to known values
int count = 0;
// Seed the random number generator
srand(time(NULL));
printf("Define the size of array A \n");
scanf("%d", &count);
// the size must be > 0
if (count < 1) {
printf("Invalid size\n");
} else {
int array[count];
printf("Generating %d random values...\n", count);
fill_array( array, count );
// Sum the array of values
sum_array( array, count );
printf("The sum of all the elements in the array=%d\n", sum);
}
}
为了让函数 fill_array 不使用任何变量,我们将使用 do-while 循环。
void fill_array(int *array, int size) {
do array[--size] = rand() % 1000;
while (size != -1);
}
最后,我们将使用递归得到我们的总和,也是不使用任何新的变量。
int sum_array(int* array, int size) {
if(!size) return 0;
else return sum_array(array, size - 1) + array[size - 1];
}