gpt4 book ai didi

c - 使用 Struct 从 C 函数返回数字列表

转载 作者:行者123 更新时间:2023-11-30 16:37:09 24 4
gpt4 key购买 nike

我正在尝试解决这个代码大战 kata

基本上,我需要编写一个程序,从特定范围(数字)中吐出一个数组/列表,其中有k个素数相乘。

countKprimes(5, 500, 600) --> [500, 520, 552, 567, 588, 592, 594]

现在我的程序“工作”了,因为它可以正确打印结果,但是如果我将它放在 codewars 的答案区域中(当然没有 main),它就会永远运行。

“错误代码 SIGKILL:进程已终止。完成时间超过 12000 毫秒”

这是 codewars 模板

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// In the preloaded section are some functions that can help.
// They can be used as a small library.
// There is no file to include, only the templates below.

struct node {
int data;
struct node *next;
};
struct list {
size_t sz;
struct node *head;
};

struct list* createList();

// push data at the head of the list
void insertFirst(struct list* l, int data);

struct list* reverse(struct list* l);

void listFree(struct list* l);

// functions to write
struct list* kPrimes(int k, int start, int nd)
{
// your code
}

这是我的代码

#include <stdio.h>

struct list{
int a[600];
};

int smallestPrimeFactor(int number){
int x;

for(x = 2; x < number; x++) {
if(number % x == 0) {
return x;
}
}
return number;
}

int primefactors(int ofnumber){
static int counter = 0;
int tempcounter = counter;
int nextnumber = ofnumber/smallestPrimeFactor(ofnumber);
if(nextnumber != 1) {
if(ofnumber >= nextnumber) {
counter++;
primefactors(nextnumber);
}
}
return (counter - tempcounter) + 1;
}

struct list kPrimes(int k, int start, int nd){
int x, g = 0;
struct list ls;
for(x = start; x < nd; x++){
if(primefactors(x) == k){
ls.a[g] = x;
g++;
}
}
return ls;
}

int main(int argc, int **argv){
int p = 5, s = 500, e = 600;
int j = 0;

while(kPrimes(p, s, e).a[j] != '\0'){
printf("%d\n", kPrimes(p, s, e).a[j]);
j++;

}
}

我认为罪魁祸首是

struct list{
int a[600];
};

也许在读取数组时,测试文件超出了 a 的索引,超过了 '\0'

我想到了一种解决这个问题的方法,即使 a 成为一个指向整数的指针,但执行 int *a; 则不会打印任何内容。

我知道返回数组的方法不止一种。使用引用、使用静态数组、传递数组作为参数等。但我想解决这个 codewars 的方式。我认为这将是一次很好的学习经历。

那么,我应该如何使用

struct node {
int data;
struct node *next;
};
struct list {
size_t sz;
struct node *head;
};

解决问题?

最佳答案

您不应该担心结构本身,您应该简单地使用提供的函数:

struct list* kPrimes(int k, int start, int nd){
int x, g = 0;
struct list *ls = createList(); // 1. Create the list.
// 2. Maybe check if ls != NULL...
for(x = start; x < nd; x++){
if(primefactors(x) == k){
insertFirst(ls, x); // 3. Insert at the beginning.
g++;
}
}

struct list *rls = reverse(ls); // 4. Reverse the list.
listFree(ls); // 5. Free the original list.
return rls; // 6. Return the reversed list.
}

由于函数 reverse 没有记录,我只能猜测它创建了一个新列表而不修改旧列表,这就是为什么您需要在之后释放它。

关于c - 使用 Struct 从 C 函数返回数字列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48096451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com