mostly implemented, things get counted double

This commit is contained in:
laura 2025-12-08 23:52:59 +01:00
parent 8d6b76e940
commit c943fdcdf7

View file

@ -10,7 +10,7 @@
char input[] =
{
#embed "input.txt"
#embed "input-.txt"
,'\0' // null terminator
};
@ -51,18 +51,14 @@ uint64_t power(uint64_t base, uint64_t exp) {
return result;
}
bool check_silly(uint64_t in){
int num = numPlaces(in);
uint64_t gen_div(int len, int spacing){
uint64_t div = 0;
for(int i = 0; i<len; i++){
div += power(10, i*spacing);
}
return div;
}
if(!(num%2)){
uint64_t div = 1+power(10, num/2);
//printf("check dividend is %d\n", div);
if(in%div == 0){
return true;
}
}
return false;
}
void sort_ranges(uint64_t* starts, uint64_t* ends, int len){
int curr_min = 0;
@ -117,19 +113,36 @@ 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++;
}
}
divs[count] = 0;
return divs;
}
uint64_t check_range(uint64_t start, uint64_t end){
int num = numPlaces(start);
if(!(num%2)){
uint64_t div = 1+power(10, num/2);
uint64_t res = 0;
for(int i = 2; i<num+1; i++){
if(!(num%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);
//printf("Range %lu - %lu\nsumup: \t%lu\nsumup_gauss: \t%lu\n\n", start, end, sum, sum2);
printf("Range %lu - %lu\ni = %d\ndiv: %lu\nsumup: \t%lu\n\n", start, end, i, div, sum*div);
return sum*div;
res += sum*div;
}
return 0;
}
return res;
}
int main(int argc, char *argv[]){