mostly implemented, things get counted double
This commit is contained in:
parent
8d6b76e940
commit
c943fdcdf7
1 changed files with 33 additions and 20 deletions
53
2_2/main.c
53
2_2/main.c
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
char input[] =
|
||||
{
|
||||
#embed "input.txt"
|
||||
#embed "input-.txt"
|
||||
,'\0' // null terminator
|
||||
};
|
||||
|
||||
|
|
@ -51,19 +51,15 @@ uint64_t power(uint64_t base, uint64_t exp) {
|
|||
return result;
|
||||
}
|
||||
|
||||
bool check_silly(uint64_t in){
|
||||
int num = numPlaces(in);
|
||||
|
||||
if(!(num%2)){
|
||||
uint64_t div = 1+power(10, num/2);
|
||||
//printf("check dividend is %d\n", div);
|
||||
if(in%div == 0){
|
||||
return true;
|
||||
}
|
||||
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 false;
|
||||
return div;
|
||||
}
|
||||
|
||||
|
||||
void sort_ranges(uint64_t* starts, uint64_t* ends, int len){
|
||||
int curr_min = 0;
|
||||
for(int i = 0; i<len-1; i++){
|
||||
|
|
@ -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 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);
|
||||
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\ni = %d\ndiv: %lu\nsumup: \t%lu\n\n", start, end, i, div, sum*div);
|
||||
|
||||
res += sum*div;
|
||||
}
|
||||
|
||||
return sum*div;
|
||||
}
|
||||
return 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue