diff --git a/archives/28/current b/archives/28/current new file mode 100755 index 0000000..797c91e Binary files /dev/null and b/archives/28/current differ diff --git a/archives/28/src/main.c b/archives/28/src/main.c new file mode 100644 index 0000000..44adde9 --- /dev/null +++ b/archives/28/src/main.c @@ -0,0 +1,68 @@ +#include +#include "utils.h" + +/* + Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows: + + 21 22 23 24 25 + 20 7 8 9 10 + 19 6 1 2 11 + 18 5 4 3 12 + 17 16 15 14 13 + + It can be verified that the sum of the numbers on the diagonals is 101. + + What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way? + + https://projecteuler.net/problem=28 +*/ + +enum dir{RIGHT,DOWN,LEFT,UP}; + +#define SPIRAL_SIZE 1001 + +int main(int argc,char**argv) { + //Move the number repeatedly in a spiral. Anytime the number in both the X and Y coordinates match, you sum. + int x=0; + int y=0; + int number=1; + long sum=0; + boolean adjust=false; + int maxCounter=1; + int counter=maxCounter; + enum dir dir=0; + while (x<=SPIRAL_SIZE/2&&y<=SPIRAL_SIZE/2&&x>=-SPIRAL_SIZE/2&&y>=-SPIRAL_SIZE/2) { + if (x==y||-x==y||x==-y||-x==-y) { + sum+=number; + printf("Added %d at (%d,%d). Sum:%ld\n",number,x,y,sum); + } + switch (dir) { + case RIGHT:{ + x++; + }break; + case DOWN:{ + y++; + }break; + case LEFT:{ + x--; + }break; + case UP:{ + y--; + }break; + } + if (--counter==0) { + if (!adjust) { + adjust=true; + } else { + adjust=false; + maxCounter++; + } + dir=(dir+1)%4; + counter=maxCounter; + } + number++; + //printf("(%d,%d)\n",x,y); + } + printf("\n\nFinal Sum:%ld",sum); + return 0; +} \ No newline at end of file diff --git a/archives/28/src/utils.c b/archives/28/src/utils.c new file mode 100644 index 0000000..47f5e25 --- /dev/null +++ b/archives/28/src/utils.c @@ -0,0 +1,173 @@ +#include "utils.h" +#include +#include + +struct String mult(struct String numb1, struct String numb2) { + struct String n1 = numb1; + struct String n2 = numb2; + byte carryover = 0; + if (numb2.length>numb1.length) { + n1=numb2; + n2=numb1; + } + int addends[n2.length][n1.length+1]; + for (int i=0;i=0;i--) { + carryover=0; + for (int j=n1.length-1;j>=0;j--) { + int mult = (n1.str[j]-'0')*(n2.str[i]-'0')+((carryover!=0)?carryover:0); + //printf(" %d/%d\n",mult,carryover); + carryover=0; + if (mult>=10) { + carryover=mult/10; + mult=mult%10; + } + addends[(n2.length-1)-i][j+1]=mult; + } + if (carryover>0) { + addends[(n2.length-1)-i][0]=carryover; + } + } + //printIntDoubleArr(n2.length,n1.length+1,addends); + struct String sum = {1,"0"}; + for (int i=0;i=numb2.length) { + for (int offset=0;offsetoffset) { + //printf("%c %c\n",numb1.str[numb1.length-offset-1],numb2.str[numb2.length-offset-1]); + int sum=((numb1.str[numb1.length-offset-1]-'0')+(numb2.str[numb2.length-offset-1]-'0'))+((carryover>0)?carryover--:0); + if (sum>=10) { + carryover=1; + sum-=10; + } + str[offset]=sum+'0'; + } else { + str[offset]=numb1.str[numb1.length-offset-1]+((carryover>0)?carryover--:0); + } + //str[offset+1]='\0'; + } + } else { + for (int offset=0;offsetoffset) { + //printf("%c %c\n",numb1.str[numb1.length-offset-1],numb2.str[numb2.length-offset-1]); + int sum=((numb1.str[numb1.length-offset-1]-'0')+(numb2.str[numb2.length-offset-1]-'0'))+((carryover>0)?carryover--:0); + if (sum>=10) { + carryover=1; + sum-=10; + } + str[offset]=sum+'0'; + } else { + str[offset]=numb2.str[numb2.length-offset-1]+((carryover>0)?carryover--:0); + } + //str[offset+1]='\0'; + } + } + if (carryover>0) { + str = realloc(str,++digitCount); + str[digitCount-1]='1'; + //str[digitCount]='\0'; + } + for (int i=0;i=-SPIRAL_SIZE/2&&y>=-SPIRAL_SIZE/2) { + if (x==y||-x==y||x==-y||-x==-y) { + sum+=number; + printf("Added %d at (%d,%d). Sum:%ld\n",number,x,y,sum); } - primes[counter++]=digit; - } - int n=0; - - int maxLength=0; - int maxA=0; - int maxB=0; - - for (int a=-999;a<1000;a++) { - for (int b=-999;b<=1000;b++) { - for (int p=0;p<2500;p++) { - if (n*n+a*n+b==primes[p]) { - n++; - p=0; - } - } - if (n>maxLength) { - maxLength=n; - maxA=a; - maxB=b; - printf("New max of %d found with n^2+%dn+%d\n",maxLength,maxA,maxB); + switch (dir) { + case RIGHT:{ + x++; + }break; + case DOWN:{ + y++; + }break; + case LEFT:{ + x--; + }break; + case UP:{ + y--; + }break; + } + if (--counter==0) { + if (!adjust) { + adjust=true; + } else { + adjust=false; + maxCounter++; } - n=0; + dir=(dir+1)%4; + counter=maxCounter; } + number++; + //printf("(%d,%d)\n",x,y); } - printf("\n\nProduct of maxes (%d*%d)=%ld\n",maxA,maxB,(long)maxA*maxB); - + printf("\n\nFinal Sum:%ld",sum); return 0; } \ No newline at end of file