summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-05-24 21:39:58 +0800
committerIru Cai <mytbk920423@gmail.com>2018-05-24 21:39:58 +0800
commit1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db (patch)
treeabde0e4da3c7fe138f3874a94d8eb7d0e44c3224
downloadproject_euler-1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db.tar.xz
initial commit
-rw-r--r--euler10.c29
-rw-r--r--euler10.scm13
-rw-r--r--euler102.c72
-rw-r--r--euler11.c46
-rw-r--r--euler114.scm14
-rw-r--r--euler12.scm41
-rw-r--r--euler13.scm104
-rw-r--r--euler14.scm28
-rw-r--r--euler16.scm9
-rw-r--r--euler17.c68
-rw-r--r--euler18.c43
-rw-r--r--euler19.c31
-rw-r--r--euler2.scm10
-rw-r--r--euler20.scm16
-rw-r--r--euler21.c52
-rw-r--r--euler22.c17
-rw-r--r--euler23.c49
-rw-r--r--euler26.scm30
-rw-r--r--euler27.c45
-rw-r--r--euler29.c31
-rw-r--r--euler39.c38
-rw-r--r--euler4.scm20
-rw-r--r--euler41.sh3
-rw-r--r--euler44.c58
-rw-r--r--euler60.c68
-rw-r--r--euler7.scm16
-rw-r--r--euler8.c20
-rw-r--r--euler99.c41
28 files changed, 1012 insertions, 0 deletions
diff --git a/euler10.c b/euler10.c
new file mode 100644
index 0000000..7d9d16b
--- /dev/null
+++ b/euler10.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#define MAX 2000000
+
+int table[MAX+1]={0};
+int primes[MAX];
+
+int main()
+{
+ int nPrimes,i,j;
+ long long sum=0;
+ for (i=2;i<=MAX;++i){
+ if (table[i]==0){
+ primes[nPrimes]=i;
+ nPrimes++;
+ sum+=i;
+ }
+ //sieve
+ for (j=2;j<=primes[nPrimes-1];++j){
+ if (i*j>MAX)
+ break;
+ else
+ table[i*j]=1;
+ }
+ }
+ printf("%lld\n",sum);
+ return 0;
+}
+
+
diff --git a/euler10.scm b/euler10.scm
new file mode 100644
index 0000000..3ae17f2
--- /dev/null
+++ b/euler10.scm
@@ -0,0 +1,13 @@
+(load "../sicp/chapter01/miller-rabin.scm")
+
+(define (sum-primes limit)
+ (define (sum-iter s l)
+ (cond ((>= l limit) s)
+ ((prime? l 5)
+ (sum-iter (+ s l) (+ l 2)))
+ (else (sum-iter s (+ l 2)))))
+ (sum-iter 2 3))
+
+(display (sum-primes (read)))
+(newline)
+(exit)
diff --git a/euler102.c b/euler102.c
new file mode 100644
index 0000000..272a54a
--- /dev/null
+++ b/euler102.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <stdbool.h>
+
+typedef struct
+{
+ int a[2],b[2],c[2];
+} triangle;
+
+static inline void
+vsub(int d[], int s[], int t[])
+{
+ d[0] = s[0] - t[0];
+ d[1] = s[1] - t[1];
+}
+
+static int
+ext_product(int s[], int t[])
+{
+ return s[0] * t[1] - s[1] * t[0];
+}
+
+static int sign(int x)
+{
+ if (x < 0)
+ return -1;
+ if (x > 0)
+ return 1;
+ return 0;
+}
+
+bool o_in_tri(triangle *t)
+{
+ int ab[2], ac[2], bc[2];
+
+ vsub(ab, t->b, t->a);
+ vsub(ac, t->c, t->a);
+ vsub(bc, t->c, t->b);
+
+ /* sig(ABxAC) = sig(OBxOC) */
+ int sabc = sign(ext_product(ab, ac));
+ int sobc = sign(ext_product(t->b, t->c));
+ if (sabc != sobc)
+ return false;
+
+ /* sig(BAxBC) = sig(OAxOC) */
+ int sbac = sign(ext_product(bc, ab));
+ int soac = sign(ext_product(t->a, t->c));
+ if (sbac != soac)
+ return false;
+
+ /* sig(CAxCB) = sig(OAxOB) */
+ int scab = sign(ext_product(ac, bc));
+ int soab = sign(ext_product(t->a, t->b));
+ if (scab != soab)
+ return false;
+
+ return true;
+}
+
+int main()
+{
+ triangle t;
+ int n = 0;
+ /* the data uses ',' to split the integers, process it with
+ * sed 's/,/ /g' first. */
+ while (scanf("%d%d%d%d%d%d", &t.a[0], &t.a[1], &t.b[0], &t.b[1],
+ &t.c[0], &t.c[1]) != EOF) {
+ if (o_in_tri(&t))
+ n++;
+ }
+ printf("%d\n", n);
+}
diff --git a/euler11.c b/euler11.c
new file mode 100644
index 0000000..ea43b48
--- /dev/null
+++ b/euler11.c
@@ -0,0 +1,46 @@
+#include <stdio.h>
+#define MAX 20
+
+int grid[MAX][MAX];
+int biggest[MAX][MAX];
+
+int main()
+{
+ int i,j,M=0;
+ for (i=0;i<MAX;++i){
+ for (j=0;j<MAX;++j){
+ scanf("%d",&grid[i][j]);
+ }
+ }
+ for (i=0;i<MAX;++i){
+ for (j=0;j<MAX;++j){
+ int p;
+ biggest[i][j]=0;
+ if (i<MAX-3){
+ p = grid[i][j]*grid[i+1][j]*grid[i+2][j]*grid[i+3][j];
+ }
+ if (j<MAX-3){
+ p = grid[i][j]*grid[i][j+1]*grid[i][j+2]*grid[i][j+3];
+ if (p>biggest[i][j])
+ biggest[i][j]=p;
+ if (i<MAX-3){
+ p = grid[i][j]*grid[i+1][j+1]*
+ grid[i+2][j+2]*grid[i+3][j+3];
+ if (p>biggest[i][j])
+ biggest[i][j]=p;
+ }
+ if (i>=3){
+ p = grid[i][j]*grid[i-1][j+1]*
+ grid[i-2][j+2]*grid[i-3][j+3];
+ if (p>biggest[i][j])
+ biggest[i][j]=p;
+ }
+ }
+ if (biggest[i][j]>M)
+ M=biggest[i][j];
+ }
+ }
+ printf("%d\n",M);
+ return 0;
+}
+
diff --git a/euler114.scm b/euler114.scm
new file mode 100644
index 0000000..e23b441
--- /dev/null
+++ b/euler114.scm
@@ -0,0 +1,14 @@
+(define (comb m n)
+ (define (citer mm nn prod)
+ (if (> mm m) prod
+ (citer (+ mm 1) (- nn 1) (/ (* prod nn) mm))))
+ (citer 1 n 1))
+
+(define (solve nn)
+ (define (addto m n)
+ (if (> m n) 0
+ (+ (comb m n) (addto (+ m 2) (- n 2)))))
+ (+ 1 (addto 2 (- nn 1))))
+
+(display (solve 50))
+(newline)
diff --git a/euler12.scm b/euler12.scm
new file mode 100644
index 0000000..e0d726f
--- /dev/null
+++ b/euler12.scm
@@ -0,0 +1,41 @@
+(define (square x) (* x x))
+(define (power x n)
+ (if (= n 0)
+ 1
+ (* x (power x (- n 1)))))
+
+(define (first-divisor x)
+ (define (try-iter d)
+ (cond ((= 0 (remainder x d)) d)
+ ((> (square d) x) x)
+ (else (try-iter (+ d 1)))))
+ (try-iter 2))
+
+(define (divexp x d)
+ (if (= (remainder x d) 0)
+ (+ (divexp (/ x d) d) 1)
+ 0))
+
+(define (ndiv n)
+ (define (pair d)
+ (cons (divexp n d) (/ n (expt d (divexp n d)))))
+ (if (= n 1) 1
+ (let ((fd (first-divisor n)))
+ (* (+ 1 (car (pair fd)))
+ (ndiv (cdr (pair fd)))))))
+
+(define (kth-factor-triangle-over-n n)
+ (define (n-fac-tri n)
+ (if (even? n)
+ (* (ndiv (/ n 2)) (ndiv (+ n 1)))
+ (* (ndiv n) (ndiv (/ (+ n 1) 2)))))
+ (define (try-iter i)
+ (if (> (n-fac-tri i) n)
+ i
+ (try-iter (+ i 1))))
+ (try-iter 1))
+
+(display
+ ((lambda (x) (/ (* x (+ x 1)) 2))
+ (kth-factor-triangle-over-n 500)))
+(newline)
diff --git a/euler13.scm b/euler13.scm
new file mode 100644
index 0000000..f4246e9
--- /dev/null
+++ b/euler13.scm
@@ -0,0 +1,104 @@
+(display
+ (+
+ 371072875339
+ 463769376774
+ 743249861995
+ 919422133635
+ 230675882075
+ 892616706966
+ 281128798128
+ 442742289174
+ 474514457360
+ 703864861058
+ 621764571418
+ 649063524627
+ 925758677183
+ 582035653253
+ 801811993848
+ 353986643728
+ 865155060062
+ 716938887077
+ 543700705768
+ 532826541087
+ 361232725250
+ 458765761724
+ 174237069058
+ 811426604180
+ 519343254517
+ 624672216484
+ 157324443869
+ 550376875256
+ 183363848253
+ 803862875928
+ 781828337579
+ 167263201004
+ 484030981290
+ 870869875513
+ 599594068957
+ 697939506796
+ 410526847082
+ 653786073615
+ 358290353174
+ 949537597651
+ 889028025717
+ 252676802760
+ 362702185404
+ 240744869082
+ 914302881971
+ 344130655780
+ 230530811728
+ 114876969321
+ 637832994906
+ 677201869716
+ 955482553002
+ 760853271322
+ 377742425354
+ 237019132757
+ 297988602722
+ 184957014548
+ 382982037830
+ 348295438291
+ 409579530664
+ 297461521855
+ 416981162220
+ 624679571944
+ 231897067725
+ 861880882258
+ 113067397083
+ 829591747671
+ 976233310448
+ 428462801835
+ 551216035469
+ 322381957343
+ 755061649651
+ 621778427521
+ 329241857071
+ 995186714302
+ 732674608005
+ 768418225246
+ 971426179103
+ 877836461827
+ 108488025216
+ 713296124747
+ 621840735723
+ 666278919814
+ 606618262936
+ 857869440895
+ 660243964099
+ 649139826800
+ 167309393198
+ 948093772450
+ 786391670211
+ 153687137119
+ 407899231155
+ 448899115014
+ 415031288803
+ 812348806732
+ 826165707739
+ 229188020587
+ 771585425020
+ 721078384350
+ 208496039801
+ 535035342264
+ ))
+(newline)
diff --git a/euler14.scm b/euler14.scm
new file mode 100644
index 0000000..3adc07a
--- /dev/null
+++ b/euler14.scm
@@ -0,0 +1,28 @@
+(define (chainlen n)
+ (define (next m)
+ (if (even? m)
+ (/ m 2)
+ (+ (* m 3) 1)))
+ (define (count-iter cur cnt)
+ (if (= cur 1)
+ cnt
+ (count-iter (next cur) (+ cnt 1))))
+ (count-iter n 1))
+
+(define (find-max-len-start limit)
+ (define (try cur longest ans)
+ (cond ((> cur limit) ans)
+ ((= (remainder (- cur 4) 6) 0)
+ ;it's even and is 3n+1=>it's 6n+4
+ (try (+ cur 1) longest ans))
+ (else
+ (let ((len (chainlen cur))
+ (curn (+ cur 1)))
+ (if (> len longest)
+ (try curn len cur)
+ (try curn longest ans))))))
+ (let ((lowest (ceiling (/ limit 2))))
+ (try lowest 1 lowest)))
+
+(display (find-max-len-start 999999))
+(newline)
diff --git a/euler16.scm b/euler16.scm
new file mode 100644
index 0000000..0260783
--- /dev/null
+++ b/euler16.scm
@@ -0,0 +1,9 @@
+(define (sum-digits n)
+ (if (= n 0)
+ 0
+ (+ (remainder n 10)
+ (sum-digits (floor (/ n 10))))))
+
+(display (sum-digits (expt 2 1000)))
+(newline)
+
diff --git a/euler17.c b/euler17.c
new file mode 100644
index 0000000..f6def67
--- /dev/null
+++ b/euler17.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+const char* num_en[]={
+ "",
+ "one", "two", "three", "four",
+ "five", "six", "seven", "eight",
+ "nine", "ten", "eleven", "twelve",
+ "thirteen", "fourteen", "fifteen", "sixteen",
+ "seventeen", "eighteen", "nineteen", "twenty",
+ "thirty", "forty", "fifty", "sixty",
+ "seventy", "eighty", "ninety"};
+
+void name_num(int num,char* name)
+{
+ name[0]=0;
+ if (num>=1000){
+ strcat(name,num_en[num/1000]);
+ strcat(name," thousand ");
+ num %= 1000;
+ if (num>0 && num<100)
+ strcat(name,"and ");
+ }
+ if (num>=100){
+ strcat(name,num_en[num/100]);
+ strcat(name," hundred ");
+ num %= 100;
+ if (num>0){
+ strcat(name,"and ");
+ }
+ }
+ if (num>20){
+ strcat(name,num_en[20-2+num/10]);
+ num %= 10;
+ if (num>0)
+ strcat(name,"-");
+ strcat(name,num_en[num%10]);
+ }else{
+ strcat(name,num_en[num]);
+ }
+}
+
+int count_letters(char* s)
+{
+ char *p;
+ int count=0;
+ for (p=s; *p; ++p){
+ if (islower(*p)){
+ ++count;
+ }
+ }
+ return count;
+}
+
+int main()
+{
+ int n,i,len,total_len=0;
+ char num_en[100];
+ for (i=1;i<=1000;++i){
+ name_num(i,num_en);
+ len = count_letters(num_en);
+ total_len += len;
+ //printf("%s %d\n",num_en,len);
+ }
+ printf("%d\n",total_len);
+ return 0;
+}
diff --git a/euler18.c b/euler18.c
new file mode 100644
index 0000000..281dc77
--- /dev/null
+++ b/euler18.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#define MAX 15
+
+int max(int i,int j)
+{
+ if (i>j)
+ return i;
+ else
+ return j;
+}
+
+int main()
+{
+ int triangle[MAX][MAX];
+ int answer[MAX][MAX];
+ int maxtotal=0;
+ int i,j;
+ for (i=0; i<MAX; ++i){
+ for (j=0; j<=i; ++j){
+ scanf("%d",&triangle[i][j]);
+ if (i==0){
+ answer[i][j]=triangle[i][j];
+ }else if (j==0){
+ answer[i][j]=
+ triangle[i][j]+answer[i-1][j];
+ }else if (j==i){
+ answer[i][j]=
+ triangle[i][j]+answer[i-1][j-1];
+ }else{
+ answer[i][j]=
+ triangle[i][j]+
+ max(answer[i-1][j-1],answer[i-1][j]);
+ }
+ if (answer[i][j]>maxtotal){
+ maxtotal=answer[i][j];
+ }
+ }
+ }
+ printf("%d\n",maxtotal);
+ return 0;
+}
+
+
diff --git a/euler19.c b/euler19.c
new file mode 100644
index 0000000..78a9d55
--- /dev/null
+++ b/euler19.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+
+const int days[2][12]={
+ {31,28,31,30,31,30,31,31,30,31,30,31},
+ {31,29,31,30,31,30,31,31,30,31,30,31}};
+
+int isleap(int y)
+{
+ if (y%4==0 && (y%100!=0 || y%400==0))
+ return 1;
+ else
+ return 0;
+}
+
+int main()
+{
+ int y,m,t;
+ int d=1+365,count=0;
+ for (y=1901;y<=2000;++y){
+ t=isleap(y);
+ for (m=0;m<12;++m){
+ d%=7;
+ if (d==0)
+ ++count;
+ d+=days[t][m];
+ }
+ }
+ printf("%d\n",count);
+ return 0;
+}
+
diff --git a/euler2.scm b/euler2.scm
new file mode 100644
index 0000000..f47cad2
--- /dev/null
+++ b/euler2.scm
@@ -0,0 +1,10 @@
+(define (sum-fib sum a b c)
+ (if (> a 4000000)
+ sum
+ (if (even? a)
+ (sum-fib (+ sum a) b c (+ b c))
+ (sum-fib sum b c (+ b c)))))
+
+(display (sum-fib 0 1 2 3))
+(newline)
+
diff --git a/euler20.scm b/euler20.scm
new file mode 100644
index 0000000..df06c9d
--- /dev/null
+++ b/euler20.scm
@@ -0,0 +1,16 @@
+(define (sum-digits n)
+ (if (= n 0)
+ 0
+ (+ (remainder n 10)
+ (sum-digits (floor (/ n 10))))))
+
+(define (! n)
+ (define (p-iter i p)
+ (if (> i n)
+ p
+ (p-iter (+ i 1) (* p i))))
+ (p-iter 1 1))
+
+(display (sum-digits (! 100)))
+(newline)
+
diff --git a/euler21.c b/euler21.c
new file mode 100644
index 0000000..d18e556
--- /dev/null
+++ b/euler21.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <math.h>
+#define MAX 9999
+
+int firstdiv(int n)
+{
+ int i;
+ int q=ceil(sqrt(n));
+ for (i=2;i<=q;++i){
+ if (n%i==0)
+ return i;
+ }
+ return n;
+}
+
+int divexp(int n,int d)
+{
+ int dd=1;
+ while (n%d==0){
+ n/=d;
+ dd*=d;
+ }
+ return dd;
+}
+
+int sumdiv(int n)
+{
+ if (n==1)
+ return 1;
+
+ int fd=firstdiv(n);
+ int fdexp=divexp(n,fd);
+ return sumdiv(n/fdexp)*(fdexp*fd-1)/(fd-1);
+}
+
+int main()
+{
+ int d[MAX+1],i,sum=0;
+ for (i=1;i<=MAX;++i){
+ d[i]=sumdiv(i)-i;
+ }
+ for (i=1;i<=MAX;++i){
+ if (i<d[i] && d[i]<=MAX && i==d[d[i]]){
+ sum+=i+d[i];
+ }else if (d[i]>MAX && sumdiv(d[i])-d[i]==i){
+ sum+=i;
+ }
+ }
+ printf("%d\n",sum);
+ return 0;
+}
+
diff --git a/euler22.c b/euler22.c
new file mode 100644
index 0000000..d969fe7
--- /dev/null
+++ b/euler22.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+int main()
+{
+ char name[10];
+ int i,j,score=0;
+ for (i=1;scanf("%s",name)!=EOF;++i){
+ int worth=0;
+ for (j=0;name[j];++j){
+ worth+=name[j]&0xbf;
+ }
+ score+=worth*i;
+ }
+ printf("%d\n",score);
+ return 0;
+}
+
diff --git a/euler23.c b/euler23.c
new file mode 100644
index 0000000..bac7b08
--- /dev/null
+++ b/euler23.c
@@ -0,0 +1,49 @@
+#include <stdio.h>
+#define MAX 100000
+
+int sum_of_div(int n)
+{
+ int fd,fdsum=1,sum=1;
+ while (n%2==0){
+ fdsum<<=1;
+ n>>=1;
+ }
+ sum *= (fdsum*2-1);
+ fd = 3;
+ while (n>1){
+ fdsum=1;
+ while (n%fd==0){
+ fdsum*=fd;
+ n/=fd;
+ }
+ sum *= (fdsum*fd-1)/(fd-1);
+ fd += 2;
+ }
+ return sum;
+}
+
+int main()
+{
+ int n,i,j;
+ int abundant[MAX];
+ int sum_abundant[MAX]={0};
+ int ans=0;
+ for (i=1;i<=28123;++i){
+ if (sum_of_div(i)>i*2){
+ abundant[i]=1;
+ for (j=1;j<=i&&j<=28123-i;++j){
+ if (abundant[j]){
+ sum_abundant[i+j]=1;
+ }
+ }
+ }else{
+ abundant[i]=0;
+ }
+ }
+ for (int i=1;i<=28123;++i){
+ if (!sum_abundant[i])
+ ans+=i;
+ }
+ printf("%d\n",ans);
+}
+
diff --git a/euler26.scm b/euler26.scm
new file mode 100644
index 0000000..6c01409
--- /dev/null
+++ b/euler26.scm
@@ -0,0 +1,30 @@
+(define (recur-cycle n)
+ (define (div_2_5 x)
+ (cond
+ ((= (remainder x 2) 0)
+ (div_2_5 (/ x 2)))
+ ((= (remainder x 5) 0)
+ (div_2_5 (/ x 5)))
+ (else x)))
+ (define (try-iter m r)
+ (if (= r 1)
+ m
+ (try-iter (+ m 1) (remainder (* r 10) n))))
+ (if (= (div_2_5 n) n)
+ (if (= n 1)
+ 0
+ (try-iter 1 (remainder 10 n)))
+ (recur-cycle (div_2_5 n))))
+
+(define (longest upper)
+ (define (try-iter n ans anscycle)
+ (if (> n upper)
+ ans
+ (let ((m (recur-cycle n)))
+ (if (> m anscycle)
+ (try-iter (+ n 1) n m)
+ (try-iter (+ n 1) ans anscycle)))))
+ (try-iter 1 1 0))
+
+(display (longest (read)))
+(newline)
diff --git a/euler27.c b/euler27.c
new file mode 100644
index 0000000..f2c2435
--- /dev/null
+++ b/euler27.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <stdlib.h>
+#define MAX 3000000
+
+int notPrime[MAX]={0};
+
+void genprimes(int n)
+{
+ notPrime[0]=1;
+ notPrime[1]=1;
+ int i,j;
+ for (i=2;i<=n;++i){
+ if (!notPrime[i]){
+ for (j=i*2;j<=n;j+=i){
+ notPrime[j]=1;
+ }
+ }
+ }
+}
+
+int main()
+{
+ int a,b,n;
+ int product=0,longest=0;
+ genprimes(MAX);
+ for (a=-999;a<=999;a+=2){
+ for (b=-997;b<=997;b+=2){
+ if (notPrime[abs(b)])
+ continue;
+ for (n=0;;++n){
+ int t=(n+a)*n+b;
+ if (notPrime[abs(t)]){
+ if (n>longest){
+ longest = n;
+ product = a*b;
+ }
+ break;
+ }
+ }
+ }
+ }
+ printf("%d\n",product);
+ return 0;
+}
+
diff --git a/euler29.c b/euler29.c
new file mode 100644
index 0000000..a9e5fc5
--- /dev/null
+++ b/euler29.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#define LIMIT 4
+
+int d[LIMIT+1][LIMIT+1]={};
+int count=(LIMIT-1)*(LIMIT-1);
+
+int main()
+{
+ int a,b,c;
+ for (a=2;a<=LIMIT;a++){
+ int bb=a;
+ for (b=2;b<=LIMIT;b++){
+ bb*=a;
+ if (bb>LIMIT) break;
+ for (c=2;c<=LIMIT/b;c++){
+ d[bb][c]=1; // (a^b)^c = a^(bc)
+ }
+ }
+ }
+ for (a=2;a<=LIMIT;a++){
+ for (b=2;b<=LIMIT;b++){
+ if (d[a][b]){
+ printf("%d %d\n",a,b);
+ --count;
+ }
+ }
+ }
+ printf("%d\n",count);
+ return 0;
+}
+
diff --git a/euler39.c b/euler39.c
new file mode 100644
index 0000000..e4cd40c
--- /dev/null
+++ b/euler39.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+
+int np(int p)
+{
+ int n = 0;
+ int a;
+
+ /* p = a + b + c, with a*a+b*b=c*c */
+ /* b = (p*p-2pa)/(2p-2a) */
+ if (p % 2 == 1)
+ return 0;
+
+ a = 1;
+ while (1) {
+ int nu = p * (p - a*2);
+ int de = (p - a) * 2;
+ if (nu % de == 0 && nu/de > a)
+ n++;
+ if (nu/de < a)
+ break;
+ a++;
+ }
+ return n;
+}
+
+int main()
+{
+ int bestp, M = 0;
+ int i;
+ for (i = 3; i<=1000; i++) {
+ int m = np(i);
+ if (m > M) {
+ bestp = i;
+ M = m;
+ }
+ }
+ printf("%d\n", bestp);
+}
diff --git a/euler4.scm b/euler4.scm
new file mode 100644
index 0000000..09408a9
--- /dev/null
+++ b/euler4.scm
@@ -0,0 +1,20 @@
+(define (palindrome? x)
+ (define (rev x ans)
+ (if (= x 0)
+ ans
+ (let ((r (remainder x 10)))
+ (rev (/ (- x r) 10) (+ r (* ans 10))))))
+ (= (rev x 0) x))
+
+(define (bigpal ans x y)
+ (if (> x 999)
+ ans
+ (if (> y 999)
+ (bigpal ans (+ x 1) (+ x 1))
+ (if (and (palindrome? (* x y)) (> (* x y) ans))
+ (bigpal (* x y) x (+ y 1))
+ (bigpal ans x (+ y 1))))))
+
+(display (bigpal 0 100 100))
+(newline)
+
diff --git a/euler41.sh b/euler41.sh
new file mode 100644
index 0000000..133d894
--- /dev/null
+++ b/euler41.sh
@@ -0,0 +1,3 @@
+# Pandigital prime is at most 7 digits, because 1+...+8 and 1+...+9 is multiply of 3
+for i in 76{1..5}{1..5}{1..5}{1..5}{1,3,5} ; do factor $i; done | sed -e '/[0-9] /d' | cut -d':' -f1 \
+ | sed $(for i in {1..7} ; do printf '\x2de /%d.*%d/d ' $i $i ; done)
diff --git a/euler44.c b/euler44.c
new file mode 100644
index 0000000..db032aa
--- /dev/null
+++ b/euler44.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+long long Pn(int n)
+{
+ return (long long)n*(long long)(3*n-1)/2;
+}
+
+#define MAXSIZE (1<<22)
+long long P[MAXSIZE];
+
+int comp(const void *a, const void *b)
+{
+ long long aa = *(long long*)a;
+ long long bb = *(long long*)b;
+ if (aa < bb)
+ return -1;
+ if (aa > bb)
+ return 1;
+ return 0;
+}
+
+int main()
+{
+ int i, j;
+ int range = (1<<15);
+ for (i = 1; i < range; i++)
+ P[i] = Pn(i);
+
+ /* i < 257 is impossible when searching with range=(1<<15) */
+ /* i < 725 is impossible with range=(1<<18) */
+ /* i < 1449 is impossible with range=(1<<20) */
+ for (i = 1; i < range; i++) {
+ long long diff = P[i];
+ for (j = 1; j < range - 1; j++) {
+ long long Pj = P[j];
+ long long Pk = Pj + diff;
+ long long Pjk = Pj + Pk;
+ if (Pk < P[j+1])
+ break;
+ while (Pjk > P[range-1]) {
+ int newrange = range * 2;
+ int r;
+ for (r = range; r < newrange; r++)
+ P[r] = Pn(r);
+ range = newrange;
+ }
+ if (!bsearch(&Pk, P+1, range-1, sizeof(long long), comp))
+ continue;
+ if (!bsearch(&Pjk, P+1, range-1, sizeof(long long), comp))
+ continue;
+ printf("i = %d, D = %lld, j = %d, P[j] = %lld\n", i, diff, j, Pj);
+ /* i = 1912, D = 5482660, j = 1020, P[j] = 1560090 */
+ return 0;
+ }
+ printf("i = %d\n", i);
+ }
+}
diff --git a/euler60.c b/euler60.c
new file mode 100644
index 0000000..3bc933c
--- /dev/null
+++ b/euler60.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#define NP 10000
+
+int primetab[NP];
+
+void genprimes()
+{
+ int i=2,j;
+ primetab[0] = 2;
+ primetab[1] = 3;
+
+ while (i<NP) {
+ primetab[i] = primetab[i-1]+2;
+ for (j=0; j<i; j++) {
+ if (primetab[i]%primetab[j]==0) {
+ // try next
+ primetab[i] += 2;
+ j=-1;
+ continue;
+ }
+ }
+ i++;
+ }
+}
+
+void search(int depth)
+{
+ static int result[5]={0,0,0,0,0}, bestsum=0;
+
+ int s=0,i;
+
+ if (depth==5) {
+ for (i=0; i<5; i++) {
+ printf("%d ", primetab[result[i]]);
+ }
+ printf("best=%d\n", bestsum);
+ }
+
+ for (i=0; i<depth; i++) {
+ s += primetab[result[i]];
+ }
+ if (bestsum && s>bestsum) return;
+
+ if (depth==0) {
+ result[0] = 1;
+ } else {
+ result[depth] = result[depth-1]+1;
+ }
+ if (result[depth]>=NP) {
+ return;
+ }
+
+ while (result[depth]<NP) {
+ // check if it's ok
+ }
+
+}
+
+int main()
+{
+ genprimes();
+ int i;
+
+ for (i=0; i<1000; i++) {
+ printf("%d\n", primetab[i]);
+ }
+ return 0;
+}
diff --git a/euler7.scm b/euler7.scm
new file mode 100644
index 0000000..50daa8a
--- /dev/null
+++ b/euler7.scm
@@ -0,0 +1,16 @@
+(load "../sicp/chapter01/miller-rabin.scm")
+
+(define (nth-prime n)
+ (define (try-iter p nth)
+ (if (prime? p 5)
+ (if (= nth (- n 1))
+ p
+ (try-iter (+ p 2) (+ nth 1)))
+ (try-iter (+ p 2) nth)))
+ (if (= n 1)
+ 2
+ (try-iter 3 1)))
+
+(display (nth-prime (read)))
+(newline)
+(exit)
diff --git a/euler8.c b/euler8.c
new file mode 100644
index 0000000..d0581be
--- /dev/null
+++ b/euler8.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+
+int main()
+{
+ int greatest=0,t;
+ char a[1100];
+ int d[1100],i;
+ scanf("%s",a);
+ for (i=0;i<4;++i)
+ d[i]=a[i]-'0';
+ for (i=4;a[i];++i){
+ d[i]=a[i]-'0';
+ t=d[i]*d[i-1]*d[i-2]*d[i-3]*d[i-4];
+ if (t>greatest)
+ greatest=t;
+ }
+ printf("%d\n",greatest);
+ return 0;
+}
+
diff --git a/euler99.c b/euler99.c
new file mode 100644
index 0000000..e337796
--- /dev/null
+++ b/euler99.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct elem
+{
+ int idx;
+ double v;
+};
+
+int comp(const void *s, const void *t)
+{
+ struct elem *ss = (struct elem*)s;
+ struct elem *tt = (struct elem*)t;
+ if (ss->v < tt->v)
+ return -1;
+ if (ss->v > tt->v)
+ return 1;
+ return 0;
+}
+
+int main()
+{
+ struct elem arr[100000];
+ int n;
+ char buffer[1000];
+
+ n = 0;
+ while (fgets(buffer, 1000, stdin)) {
+ if (strlen(buffer) < 3)
+ break;
+ int a = atoi(buffer);
+ int b = atoi(strchr(buffer, ',')+1);
+ arr[n].idx = n + 1;
+ arr[n].v = b * log(a);
+ n ++;
+ }
+ qsort(arr, n, sizeof(arr[0]), comp);
+ printf("%d\n", arr[n-1].idx);
+}