problem 1-4

Problem 1:

#include <stdio.h>

int main()
{
    int n=0,i=0,j;
    while(i<997)n+=(i+=3);
    for(i=5;i<1000;i+=15)n+=((j=i+5)<1000)?i+j:i;
    printf("%d\n", n);
}

Problem2:

#include <stdio.h>

int main()
{
    int n=0,t1=1,t2=2;
    while(t2 < 4000000) {
        n+=(t2%2==0)?t2:0;
        t2+=t1;
        t1=t2-t1;
    }
    printf("%d\n", n);
}

Problem3:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 10000

int main()
{
    unsigned long long int *result=(long long int *)malloc(sizeof(long long int)*SIZE);
    unsigned long long int *primes=(long long int *)malloc(sizeof(long long int)*SIZE);
    long long int max=600851475143LL,n=5,i=2,j,k;
    primes[0]=2;
    primes[1]=3;
    for(;n*n < max;n+=2) {
        long long int f=1;
        for(k=1;k<i&&f;k++,f=1) {
            f*=n%primes[k];
        }
        if(f) primes[i++]=n;
    }
    for(j=0,k=0;j<i;j++) {
        if((max%primes[j])==0) result[k++]=primes[j];
    }
    for(j=0;j<k;j++) {
        printf("%lld ", result[j]);
    }
    printf("\n");
    free(result);
    free(primes);
    return 0;
}

Problem4:

#include <stdio.h>
#include <math.h>

int digits(int n)
{
    int i=1,j=0;
    if(n==0) return 1;
    while(n>=i) i*=10,j+=1;
    return j;
}

int nth(int n, int i)
{
    if(i==1) return n-(n/10)*10;
    return nth(n/10,i-1);
}

int isPalindrome(int n, int d_prev)
{
    int i,j,d;
    if((d=digits(n))<d_prev-2) {
        if(n==0) return 1;
        for(i=0;i<d_prev-2-d;i++) {
            if(nth(n,1)!=0) return 0;
            n /= 10;
        }
        return isPalindrome(n,digits(n)+2);
    }
    if(d==1) return 1;
    if(d==2) {
        for(i=1;i<10;i++) if(i*11==n) return 1;
        return 0;
    }
    return ((i=nth(n,d))==(j=nth(n,1)))?isPalindrome((n-i*(int)pow(10,d-1)-j)/10,d):0;
}

int main()
{
    int i,j,max=0;
    for(i=999;i>100;i--) {
        for(j=999;j>100;j--){
            int n = i*j;
            if(isPalindrome(n,digits(n)+2)) max=(n>max)?n:max;
        }
    }
    printf("%d\n",max);
}