Заменить все числа, представляющие число два в целочисленной степени сочетанием 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, т.е. успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д