From 414cdf7f6365da7866ea695b89d0b3e011cadaf2 Mon Sep 17 00:00:00 2001 From: laura Date: Wed, 10 Dec 2025 17:42:46 +0100 Subject: [PATCH] given up for the moment x.x --- 2_2/main.c | 107 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/2_2/main.c b/2_2/main.c index d3ad8d8..5a52d17 100644 --- a/2_2/main.c +++ b/2_2/main.c @@ -14,6 +14,12 @@ char input[] = ,'\0' // null terminator }; +typedef struct{ + uint64_t* divs; + int count; + int pos_count; +} divisors; + //char input[] = "L68\nL30\nR48\nL5\nR60\nL55\nL1\nL99\nR14\nL82\n"; int width = 0; int height = 0; @@ -21,6 +27,8 @@ uint64_t result = 0; uint64_t result_2 = 0; + + uint64_t parseNum(char* str, int* len){ int i = 0; uint64_t out = 0; @@ -113,35 +121,98 @@ uint64_t sumup_gauss(uint64_t a, uint64_t b){ return sum_gauss(b)-sum_gauss(a-1); } -int* find_divs(int num){ - int* divs = calloc(num, sizeof(int)); - int count = 0; - for(int i = num+1; i>=2; i--){ - if(!(num%i)){ - divs[count] = i; - count++; +uint64_t scm(uint64_t a, uint64_t b, uint64_t limit){ + uint64_t res = a; + while(res%b!=0){ + res += a; + if(res>limit){ + return 0; } } - divs[count] = 0; + return res; +} + +void gen_scms(uint64_t* divs, int* count, int* pos_count){ + for(int i = 0; i<*pos_count-1; i++){ + for(int o = i+1; i<*pos_count; i++){ + uint64_t newdiv = scm(divs[i], divs[o], power(10, numPlaces(divs[i]*2))); + if(newdiv!=0){ + printf("\t\tfound scm divisor: %lu", newdiv); + divs[*count] = newdiv; + (*count)++; + } + } + } +} + +divisors* find_divs(int num){ + + divisors* divs = calloc(sizeof(divisors), 1); + + divs->divs = calloc(num, sizeof(uint64_t)); + printf("\tsearching for natural divisors\n"); + for(int i = 2; i<=num; i++){ + if(!(num%i)){ + uint64_t newdiv = gen_div(i, num/i); + printf("\t\tfound %lu natural divisor\n", newdiv); + //bool redundant = false; + //for(int i = 0; idivs[divs->count] = newdiv; + divs->count++; + + } + } + + printf("\tsearching for scm divisors\n"); + + gen_scms(divs->divs, &(divs->count), &(divs->pos_count)); return divs; } +//4174379265 + + +//4174601487 +//4174601487 +//4174823709 +//4174823709 +//4174823709 uint64_t check_range(uint64_t start, uint64_t end){ + printf("Range %lu - %lu\n", start, end); int num = numPlaces(start); uint64_t res = 0; - for(int i = 2; icount; i++){ + uint64_t div = divs->divs[i]; + //uint64_t div = gen_div(i, num/i); + uint64_t a = ((start+div-1)/div); + uint64_t b = (end)/div; + //uint64_t sum = sumup(a, b); + uint64_t sum = sumup_gauss(a, b); + if(ipos_count){ res += sum*div; } - + else{ + res -= sum*div; + } + printf("div: %lu\nsumup: \t%lu\ncount: \t%lu\n", div, sum*div, res); } + printf("=============================================================\n"); + free(divs->divs); + free(divs); + return res; }