Я на самом деле работаю над projecteuler.com problem (#12 specifically), и я думал, что у меня это было прибито, когда у меня не было ошибок компиляции. Он работает и дает мне несколько результатов, которые кажутся правильными, но это не заканчивается. Я не использовал C так долго, поэтому я, вероятно, не замечаю того, с чем я просто не знаком. Может кто-нибудь сказать мне, почему он останавливается? Это дает мне правильные номера треугольников до 12,5 М. Я также с радостью принимаю предложения по оптимизации в комментариях. Результаты во-первых, даже через несколько часов он не двигался мимо первого числа с 30 факторами, которые он нашел довольно быстро. Это дает мне это, из кода следующего за ним:Почему это останавливается раньше?
$ ./euler12
Current= 1
Factors= 1
Current= 3
Factors= 2
Current= 6
Factors= 4
Current= 28
Factors= 6
Current= 36
Factors= 9
Current= 120
Factors= 16
Current= 300
Factors= 18
Current= 528
Factors= 20
Current= 630
Factors= 24
Current= 1008
Factors= 30
где ток дает мне номер его получил факторы от и, очевидно, то факторы является ряд факторов. Я не даю никаких ошибок и единственным предупреждением из -Wall является то, что я фактически не использую «бесполезную» переменную ни для чего.
#include <stdio.h>
#include <time.h>
/*
Tristen
euler12.c
December 23, 2013
What's the value of the first triangle number to have over 500 divisors?
*/
int main(void)
{
/*---------Variables----------*/
time_t t1 = time(NULL);
int g,l,i,j,k,t,number,val,flag1,flag2;
int h=1,x=0,p=0,n=5000,m=500,m2=600,twitch=0
int answer=0,count=0,useless=0,linlen=0; /*modify n to change size*/
/*----------Arrays------------*/
int numtocheck[n];
int factors[m2];
/*find triangle numbers*/
for(i=0;i<=n+1;i++){
x+=i;
if(x!=0){
numtocheck[i]=x;
}
else{
useless=0;
}
}
/*begin checking for factors*/
while(twitch!=1){
count=0;
for(l=1;l<m2;l++){
factors[l]=0;
}
number=numtocheck[h];
for(j=0;j<=number;j++){
for(k=0;k<=number;k++){
val=j*k;
if(val==number){
flag1=0,flag2=0;
for(g=0;g<m2;g++){
if(factors[g]==j){
flag1=1;
}
else if(factors[g]==k){
flag2=1;
}
else{
useless=0;
}
}
if(flag1==0){
factors[p]=j;
p+=1;
}
else if(flag2==0){
factors[p]=k;
p+=1;
}
else{
useless=0;
}
}
}
}
for(l=0;l<m2;l++){
if(factors[l]!=0){
count+=1;
}
}
if(count>=m){
answer=number;
printf("Current= %d\n",number);
printf("Factors= %d\n",linlen);
twitch=1;
}
else{
if(count>linlen){
linlen=count;
printf("Current= %d\n",number);
printf("Factors= %d\n",linlen);
}
else{
useless=0;
}
}
h+=1;
}
time_t t2 = time(NULL);
t=t2-t1;
printf("Survey says %d\n", answer);
printf("time %d\n", t);
getchar();
return 0;
}
Вы можете выполнить это поэтапно с помощью отладчика, чтобы определить, что он делает (и почему). –
Первый цикл 'for' обращается к недопустимой позиции в' numtocheck', когда 'i == n || i == n + 1'; тест 'x! = 0' будет оцениваться как true, и вы присвойте' x' 'numtocheck [n]', и в следующей итерации вы сделаете то же самое для 'numtocheck [n + 1]', ошибок. –
int numtocheck [n]; поэтому размер равен n, но в цикле for; для (i = 0; i <= n + 1; i ++) ... возможно, вы должны получить ошибку сегментации, поскольку она из стеков, это может быть переписывание данных по массиву факторов – hevi