diff options
author | Iru Cai <mytbk920423@gmail.com> | 2018-05-24 21:39:58 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2018-05-24 21:39:58 +0800 |
commit | 1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db (patch) | |
tree | abde0e4da3c7fe138f3874a94d8eb7d0e44c3224 | |
download | project_euler-1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db.tar.xz |
initial commit
-rw-r--r-- | euler10.c | 29 | ||||
-rw-r--r-- | euler10.scm | 13 | ||||
-rw-r--r-- | euler102.c | 72 | ||||
-rw-r--r-- | euler11.c | 46 | ||||
-rw-r--r-- | euler114.scm | 14 | ||||
-rw-r--r-- | euler12.scm | 41 | ||||
-rw-r--r-- | euler13.scm | 104 | ||||
-rw-r--r-- | euler14.scm | 28 | ||||
-rw-r--r-- | euler16.scm | 9 | ||||
-rw-r--r-- | euler17.c | 68 | ||||
-rw-r--r-- | euler18.c | 43 | ||||
-rw-r--r-- | euler19.c | 31 | ||||
-rw-r--r-- | euler2.scm | 10 | ||||
-rw-r--r-- | euler20.scm | 16 | ||||
-rw-r--r-- | euler21.c | 52 | ||||
-rw-r--r-- | euler22.c | 17 | ||||
-rw-r--r-- | euler23.c | 49 | ||||
-rw-r--r-- | euler26.scm | 30 | ||||
-rw-r--r-- | euler27.c | 45 | ||||
-rw-r--r-- | euler29.c | 31 | ||||
-rw-r--r-- | euler39.c | 38 | ||||
-rw-r--r-- | euler4.scm | 20 | ||||
-rw-r--r-- | euler41.sh | 3 | ||||
-rw-r--r-- | euler44.c | 58 | ||||
-rw-r--r-- | euler60.c | 68 | ||||
-rw-r--r-- | euler7.scm | 16 | ||||
-rw-r--r-- | euler8.c | 20 | ||||
-rw-r--r-- | euler99.c | 41 |
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); +} |