我正在尝试解决此代码问答kata
基本上我需要编写一个程序,从一个具有array/list
乘法的特定范围(数字)中吐出k primes
个数字。
countKprimes(5, 500, 600) --> [500, 520, 552, 567, 588, 592, 594]
现在我的程序“正常”,因为它可以正确打印结果,但如果我把它放在代码报的回答区域(当然没有main
),它就会永远运行。
“错误代码SIGKILL
:流程已终止。完成时间超过12000毫秒”
这是代码战模板
#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];
};
也许在阅读数组时,测试文件超过了'\0'
之后的索引。
我想到了通过使a
指向整数的指针来解决这个问题的方法,但是int *a;
执行任何操作都没有。
我知道返回数组的方法不止一种。使用referance,使用静态数组,将数组作为参数传递等。但我想解决这种代码问题的方式。认为这将是一个很好的学习经历。
那么,我应该如何使用
struct node {
int data;
struct node *next;
};
struct list {
size_t sz;
struct node *head;
};
解决问题?
答案 0 :(得分:0)
你不应该为结构本身而烦恼,你应该只使用提供的函数:
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
没有记录,我只能猜测它会创建一个新列表而不修改旧列表,这就是你需要在之后释放它的原因。
答案 1 :(得分:0)
createList()
,insertFirst()
,reverse()
和listFree()
函数,以及消耗 函数返回值的函数全部都提供给您,它们都使用struct list
和struct node
类型。那么,如果你试图使用与现有函数不同的struct list
使用它,那么你怎么能想到呢?
所以是的,您应该使用提供给您的struct node
和struct list
类型 - 以及操作它们的便捷函数 - 而不是使用相同的标记定义不同的结构类型。