Консультация № 176932
26.02.2010, 22:01
0.00 руб.
0 4 1
Здравствуйте дорогие эксперты. Помогите решить задачку.
Необходимо вывести на экран и записать в файл output.txt все возможные строки длиной n символов (n читается из файла input.txt), состоящие только из n - 2 символов '0' и 2 символов '1'.

Примеры файлов: "input.txt" содержит число 3, в файле "output.txt" должно получиться следующее
011
101
110

Тут мне еще дали примечание. Но можно обойтись и без негона ваш вкус :)

Примечание. z=(i >> p log2 (m+1) & m
z – индекс числового знака из набора доступных для представления числа, z принадлежит [0,m]
i – исследуемое целое положительное число
p – индекс числового знака в позиции числа, представленного в (m+1) системе счисления. ( >> и & - битовые операции в C++)

заранее спасибо )))

Обсуждение

Неизвестный
26.02.2010, 22:53
общий
27.02.2010, 00:03
это ответ
Здравствуйте, Ермакова Екатерина Андреевна.

Программа, решающая поставленную задачу, приведена в приложении. От С++ в ней используется совсем немного.
Пример:
input.txt
Код:
5


output.txt:
Код:
11000
10100
10010
10001
01100
01010
01001
00110
00101
00011


Успехов!

В приложение добавлен вариант с потоковым вводом-выводом по просьбе автора ответа

Приложение:
#include "stdio.h"
#include <memory.h>

int main()
{
// открываем исходный файл для чтения
FILE* f = fopen( "input.txt", "rt" );
if( !f ) {
fprintf( stderr, "Cannot open file input.txt\n" );
return 1;
}
char buf[32];

// читаем первую строку (лучше использовать пару fgets()/sscanf(), чем просто fscanf())
char* p = fgets( buf, sizeof buf, f );
fclose( f ); // исходный файл больше не нужен
if( !p ) {
fprintf( stderr, "Cannot read data from file input.txt\n" );
return 2;
}

// извлекаем число и проверяем его
int n;
if( sscanf( buf, "%d", &n ) != 1 || n < 2 ) {
fprintf( stderr, "Wrong data in the input file.\n" );
return 3;
}

// открываем файл для записи результата
if( !(f = fopen( "output.txt", "wt" )) ) {
fprintf( stderr, "Cannot open file output.txt\n" );
return 4;
}

// выделяем память для строки (с учетом конечного 0 и места для '\n')
if( !(p = new char[n+2]) ) {
fprintf( stderr, "Not enough memory.\n" );
fclose( f );
return 5;
}

// заполняем строку символами '0'
memset( p, '0', n );
p[n] = '\n'; // чтобы не использовать строку формата - так быстрее
p[n+1] = 0;

// Формируем возможные перестановки и выводим на экран (stdout) и в файл.
// Для вывода на экран используем fputs( p, stdout ), а не puts( p ),
// поскольку puts() добавляет '\n' в конце строки, а у нас этот символ уже есть.
for( int i = 0; i < n-1; ++i ) {
p[i] = '1';
for( int j = i+1; j < n; ++j ) {
p[j] = '1';
fputs( p, stdout );
fputs( p, f );
p[j] = '0';
}
p[i] = '0';
}
delete p; // освобождаем память
fclose( f ); // закрываем файл
return 0;
}

//==============================================================//
//Вариант с использованием потокового ввода-вывода
//=============================================================//
#include <fstream>
#include <iostream>
#include <memory.h>
using namespace std;

int main()
{
// Чтобы выводились русские сообщения (строки должны быть в Unicode)
locale::global(locale("russian_russia.866"));
ifstream in( "input.txt" );

int n;
in >> n; // читаем длину строки
in.close();
// проверяем число
if( n < 2 ) {
wcout << L"Неверные данные во входном файле." << endl;
return 3;
}

ofstream out( "output.txt" );

// выделяем память для строки (с учетом конечного 0 и места для '\n')
char* p = new char[n+2];
if( !p ) {
wcout << L"Не хватает памяти." << endl;
return 5;
}

// заполняем строку символами '0'
memset( p, '0', n );
p[n] = '\n'; // чтобы не использовать строку формата - так быстрее
p[n+1] = 0;

// Формируем возможные перестановки и выводим на экран (cout) и в файл (out).
for( int i = 0; i < n-1; ++i ) {
p[i] = '1';
for( int j = i+1; j < n; ++j ) {
p[j] = '1';
cout << p;
out << p;
p[j] = '0';
}
p[i] = '0';
}
delete p; // освобождаем память
return 0;
}
5
спасибо :)
Неизвестный
26.02.2010, 23:13
общий
Вот еще вариант с использованием потоков для ввода/вывода:

Код:
#include <fstream>
#include <iostream>
#include <memory.h>
using namespace std;

int main()
{
// Чтобы выводились русские сообщения (строки должны быть в Unicode)
locale::global(locale("russian_russia.866"));
ifstream in( "input.txt" );

int n;
in >> n; // читаем длину строки
in.close();
// проверяем число
if( n < 2 ) {
wcout << L"Неверные данные во входном файле." << endl;
return 3;
}

ofstream out( "output.txt" );

// выделяем память для строки (с учетом конечного 0 и места для '\n')
char* p = new char[n+2];
if( !p ) {
wcout << L"Не хватает памяти." << endl;
return 5;
}

// заполняем строку символами '0'
memset( p, '0', n );
p[n] = '\n'; // чтобы не использовать строку формата - так быстрее
p[n+1] = 0;

// Формируем возможные перестановки и выводим на экран (cout) и в файл (out).
for( int i = 0; i < n-1; ++i ) {
p[i] = '1';
for( int j = i+1; j < n; ++j ) {
p[j] = '1';
cout << p;
out << p;
p[j] = '0';
}
p[i] = '0';
}
delete p; // освобождаем память
return 0;
}


Модератору: если считаете нужным или желательным, то добавьте, пожалуйста, этот вариант в мой ответ. Спасибо.
Неизвестный
27.02.2010, 05:54
общий
большое спасибо :)) быстро вы решили эту задачку :)) молодцы
Неизвестный
27.02.2010, 06:09
общий
да , спасибо вам большое :)
Форма ответа