#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>
long long str2longlong(const char *str);
long square_sum(long long num);
long pow_long(long x, long y);
int main(int argc, char const *argv[])
{
if (argc != 4){
fprintf(stderr, "Wrong number of arguments. Usage: %s k a b\n", argv[0]);
exit(EXIT_FAILURE);
}
long long a, b, k;
int counter = 0;
k = str2longlong(argv[1]);
a = str2longlong(argv[2]);
b = str2longlong(argv[3]);
long long multiplier = (a % k) ? a / k + 1 : a / k;
long long candidate = k * multiplier;
// printf("%lld\n", multiplier);
//printf("%ld\n", square_sum((long)a));
while (candidate < b){
if (k * square_sum(candidate) == candidate) {
//printf("%lld\n", candidate);
++counter;
}
candidate += k;
}
printf("%d\n", counter);
return 0;
}
long square_sum(long long num){
long res = 0;
while (num != 0) {
res += pow_long((num % 10), 2);
num /= 10;
}
return res;
}
long pow_long(long x, long y){
int i;
long res = 1;
for (i = 0; i < y; ++i)
res *= x;
return res;
}
long long str2longlong(const char *str){
int base = 10;
char *endptr;
errno = 0;
long long res = strtoll(str, &endptr, base);
if (errno == ERANGE) {
fprintf(stderr, "Overflow or underflow\n");
exit(EXIT_FAILURE);
}
if (endptr == str) {
fprintf(stderr, "No digits were found\n");
exit(EXIT_FAILURE);
}
return res;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <math.h> long long str2longlong(const char *str); long square_sum(long long num); long pow_long(long x, long y); int main(int argc, char const *argv[]) { if (argc != 4){ fprintf(stderr, "Wrong number of arguments. Usage: %s k a b\n", argv[0]); exit(EXIT_FAILURE); } long long a, b, k; int counter = 0; k = str2longlong(argv[1]); a = str2longlong(argv[2]); b = str2longlong(argv[3]); long long multiplier = (a % k) ? a / k + 1 : a / k; long long candidate = k * multiplier; // printf("%lld\n", multiplier); //printf("%ld\n", square_sum((long)a)); while (candidate < b){ if (k * square_sum(candidate) == candidate) { //printf("%lld\n", candidate); ++counter; } candidate += k; } printf("%d\n", counter); return 0; } long square_sum(long long num){ long res = 0; while (num != 0) { res += pow_long((num % 10), 2); num /= 10; } return res; } long pow_long(long x, long y){ int i; long res = 1; for (i = 0; i < y; ++i) res *= x; return res; } long long str2longlong(const char *str){ int base = 10; char *endptr; errno = 0; long long res = strtoll(str, &endptr, base); if (errno == ERANGE) { fprintf(stderr, "Overflow or underflow\n"); exit(EXIT_FAILURE); } if (endptr == str) { fprintf(stderr, "No digits were found\n"); exit(EXIT_FAILURE); } return res; } |
English