Заменить все числа, представляющие число два в целочисленной степени сочетанием 2^n - C (СИ)
Формулировка задачи:
Текстовый файл содержит целые числа. Заменить все числа, представляющие число два в целочисленной степени сочетанием 2^n (где n – степень). Например: 8 – 2^3, 32 – 2^5. (на С)
Решение задачи: «Заменить все числа, представляющие число два в целочисленной степени сочетанием 2^n»
textual
Листинг программы
#include <stdio.h>
#include <assert.h>
int IsPow2(int value) {
return !(value & (value - 1)) && value;
}
int GetExponent2(int value) {
return (value < 2) ? 0 : 1 + GetExponent2(value >> 1);
}
int main(int argc, char* argv[]) {
const char CFileName[] = "file.txt";
char tmpName[L_tmpnam];
FILE* fsrc, * fdst;
int value;
tmpnam(tmpName);
assert((fsrc = fopen(CFileName, "r")) != NULL);
assert((fdst = fopen(tmpName, "w")) != NULL);
while ((fscanf(fsrc, "%d", &value)) == 1) {
if (IsPow2(value)) {
fprintf(fdst, "2^%d ", GetExponent2(value));
}
else {
fprintf(fdst, "%d ", value);
}
}
fclose(fdst);
fclose(fsrc);
assert(remove(CFileName) == 0);
assert(rename(tmpName, CFileName) == 0);
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяются две функции: IsPow2 и GetExponent2
- В функции main открывается исходный файл для чтения и создается временный файл для записи
- В цикле while считываются числа из исходного файла
- Если число является числом два в целочисленной степени, то в цикле рекурсивно вызывается функция GetExponent2 и выводится в файл запись вида
2^n - Если число не является числом два в целочисленной степени, то оно выводится в файл как есть
- После окончания цикла закрываются файлы
- Удаляется исходный файл
- Переименовывается временный файл в исходное имя
- Программа возвращает 0, т.е. успешно завершилась