made 2-1 acceptably fast
This commit is contained in:
parent
0bc074c0b3
commit
61400d87e2
1 changed files with 70 additions and 13 deletions
83
2/main.c
83
2/main.c
|
|
@ -18,6 +18,8 @@ char input[] =
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
uint64_t result = 0;
|
uint64_t result = 0;
|
||||||
|
uint64_t result_2 = 0;
|
||||||
|
|
||||||
|
|
||||||
uint64_t parseNum(char* str, int* len){
|
uint64_t parseNum(char* str, int* len){
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
@ -81,11 +83,60 @@ void sort_ranges(uint64_t* starts, uint64_t* ends, int len){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//splits ranges that go over a decimal overflow barrier into two (or if necessary more) ranges
|
||||||
|
void optimize_ranges(uint64_t* starts, uint64_t* ends, int* len){
|
||||||
|
for(int i = 0; i<(*len); i++){
|
||||||
|
if(numPlaces(starts[i])<numPlaces(ends[i])){
|
||||||
|
//printf("Range %lu - %lu crosses barrier\n", starts[i], ends[i]);
|
||||||
|
ends[*len] = ends[i];
|
||||||
|
ends[i] = power(10, numPlaces(starts[i]))-1;
|
||||||
|
starts[*len] = power(10, numPlaces(starts[i]));
|
||||||
|
(*len)++;
|
||||||
|
|
||||||
|
|
||||||
|
//printf("Split into %lu - %lu\n", starts[i], ends[i]);
|
||||||
|
//printf("and %lu - %lu\n\n", starts[*len], ends[*len]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t sumup(uint64_t a, uint64_t b){
|
||||||
|
uint64_t res = 0;
|
||||||
|
for(uint64_t i = a; i<=b; i++){
|
||||||
|
res += i;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t sum_gauss(uint64_t a){
|
||||||
|
return (a*(a+1))/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t sumup_gauss(uint64_t a, uint64_t b){
|
||||||
|
return sum_gauss(b)-sum_gauss(a-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
return sum*div;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]){
|
int main(int argc, char *argv[]){
|
||||||
clock_t start, end;
|
clock_t start, end;
|
||||||
start = clock();
|
start = clock();
|
||||||
|
|
||||||
printf("INT_MAX: %d\n", INT_MAX);
|
//printf("INT_MAX: %d\n", INT_MAX);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int num_ranges = 1;
|
int num_ranges = 1;
|
||||||
|
|
@ -96,8 +147,8 @@ int main(int argc, char *argv[]){
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t starts[num_ranges];
|
uint64_t starts[num_ranges*2];
|
||||||
uint64_t ends[num_ranges];
|
uint64_t ends[num_ranges*2];
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
int range_num = 0;
|
int range_num = 0;
|
||||||
|
|
@ -112,18 +163,23 @@ int main(int argc, char *argv[]){
|
||||||
range_num++;
|
range_num++;
|
||||||
}
|
}
|
||||||
|
|
||||||
sort_ranges(starts, ends, num_ranges);
|
|
||||||
|
|
||||||
|
optimize_ranges(starts, ends, &num_ranges);
|
||||||
|
|
||||||
for(i = 0; i<num_ranges; i++){
|
for(i = 0; i<num_ranges; i++){
|
||||||
printf("checking range %lu-%lu\n\n", starts[i], ends[i]);
|
//printf("checking range %lu-%lu\n", starts[i], ends[i]);
|
||||||
for(uint64_t o = starts[i]; o<=ends[i]; o++){
|
result_2 += check_range(starts[i], ends[i]);
|
||||||
//printf("checking %d for sillyness\n", o);
|
//for(uint64_t o = starts[i]; o<=ends[i]; o++){
|
||||||
if(check_silly(o)){
|
// //printf("checking %d for sillyness\n", o);
|
||||||
result += o;
|
// if(check_silly(o)){
|
||||||
printf("%lu is SILLY!\t\tcount is %lu\n", o, result);
|
// result += o;
|
||||||
|
// //printf("%lu is SILLY!\t\tcount is %lu\n", o, result);
|
||||||
}
|
//
|
||||||
}
|
// }
|
||||||
|
//}
|
||||||
|
//printf("count: %lu\n", result);
|
||||||
|
//printf("count_2: %lu\n\n", result_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//if(check_silly(1212)){
|
//if(check_silly(1212)){
|
||||||
|
|
@ -134,6 +190,7 @@ int main(int argc, char *argv[]){
|
||||||
|
|
||||||
end = clock();
|
end = clock();
|
||||||
printf("count: %lu\n", result);
|
printf("count: %lu\n", result);
|
||||||
|
printf("count_2: %lu\n", result_2);
|
||||||
clock_t ticks_taken = end - start;
|
clock_t ticks_taken = end - start;
|
||||||
double time_taken = ((double)ticks_taken)/CLOCKS_PER_SEC;
|
double time_taken = ((double)ticks_taken)/CLOCKS_PER_SEC;
|
||||||
printf("time take: %f ticks\n", time_taken);
|
printf("time take: %f ticks\n", time_taken);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue