Красивые числа


Источник: Problem B. Tidy Numbers

Задача

Татьяна любит порядок во всём. Её игрушки упорядочены от самой маленькой до самой большой, её карандаши расположены от самого короткого до самого длинного, а её компьютеры расставлены от самого старого до самого нового. Однажды во время тренировки навыков счёта она заметила, что у некоторых целых чисел, записанных в десятичной системе счисления, цифры расположены в неубывающем порядке. Примеры таких чисел: 8, 123, 555 и 224488. Она решила называть такие числа красивыми. Числа, не обладающие таким свойством (20, 321, 495 и 999990), – некрасивые. Читать далее

Реклама
Рубрика: перевод, программирование | Метки: | Оставить комментарий

Решение задачи B квалификационного раунда Google CodeJam 2017


Условия задачи

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

const unsigned MAXDIGIT = 18;
const char ZERO = '0';
const char NINE = '9';

unsigned notTidy(char *num)
{
  unsigned len;
  len = strlen(num);
  char d1[2];
  char d2[2];
  d1[1] = 0;
  d2[1] = 0;
  for (unsigned i = 1; i < len; i++){
    d2[0] = num[i];
    d1[0] = num[i - 1];
    if (atoi(d2) < atoi(d1))
      return i;
  }
  return 0;
}

char dec(const char digit)
{
  if (digit == ZERO) return '9';
  else return digit - 1;
}

void tidy(char *num, unsigned bad)
{
  unsigned len = strlen(num);
  unsigned i;
  for (i = len - 1; i >= bad; i--){
    num[i] = NINE;
  }
  num[bad - 1] = dec(num[bad - 1]);
  if (num[0] == ZERO){
    for (i = 0; i < len - 1; i++)
      num[i] = num[i + 1];
    num[i] = 0;
  }
}

int main()
{
  unsigned T, t; cin >> T;
  char num[MAXDIGIT + 1];
  unsigned bad;
  for (t = 1; t <= T; t++){
    scanf("%s", &num);
    while ((bad = notTidy(num)) > 0)
      tidy(num, bad);
    cout << "Case #" <<  t << ": " << num << endl;
  }
}

 

Рубрика: программирование | Метки: , | Оставить комментарий

Решение задачи «A» 1 квалификационного раунда RCC 2017


Текст задачи «Марсианский волейбол»

#include <iostream>
using namespace std;

int main() {
  unsigned short t;
  unsigned short k, x, y, m, maxx, minn, diff;
  cin >> t;
  unsigned short i = 0;
  const char MINDIFF = 2;
  while (i++ < t) { cin >> k;
    cin >> x;
    cin >> y;
    m = 0;
    if (x > y) {
      maxx = x;
      minn = y;
    }
    else {
      maxx = y;
      minn = x;
    }
    if (k > maxx)
      m += k - maxx;
    diff = maxx + m - minn;
    if (diff < MINDIFF)
      m += MINDIFF -diff;
    cout << m << endl;
  }
	return 0;
}
Рубрика: программирование | Метки: , | Оставить комментарий

Новые параметры компилятора Microsoft C/C++ для управления наборами символов


Автор: Джим Спринфилд.
Источник: New Options for Managing Character Sets in the Microsoft C/C++ Compiler.

Компилятор Microsoft C/C++ развивался вместе с DOS, 16-разрядной Windows и 32/64-разрядной Windows. Его поддержка различных наборов символов, кодовых страниц и Unicode также менялась всё это время. Эта запись объяснит, как наш компилятор работал раньше и расскажет о новых параметрах  компилятора C/C в Visual Studio 2015 Update 2 CTP в части поддержки файлов UTF-8 без BOM и управления наборами символов выполнения. Пожалуйста, скачайте его и попробуйте.  Сведения о других изменения компилятора в обновлении 2 приведены в этой записи. Читать далее

Рубрика: перевод | Метки: , , , | Оставить комментарий

Удаление пустых файлов из папки Temp


#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(){
  TCHAR TempDir[MAX_PATH];
  DWORD ErrorCode;
  DWORD result = GetTempPath(MAX_PATH, TempDir);
  WIN32_FIND_DATA fd;
  string pattern(TempDir);
  pattern.append("*");
  HANDLE hFind = FindFirstFile(pattern.c_str(), &fd);
  if (hFind == INVALID_HANDLE_VALUE){
    ErrorCode = GetLastError();
    cout << "FindFirstFile failed with error code " << ErrorCode << endl;
    return ErrorCode;
  }
  vector<string> files;
  do {
    if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
      if (fd.nFileSizeLow == 0 && fd.nFileSizeHigh == 0)
        files.push_back(string(TempDir) + fd.cFileName);
  }
  while (FindNextFile(hFind, &fd) != 0);
  FindClose(hFind);
  int fcount = files.size();
  cout << "Empty files count: " << fcount << endl;
  int dcount = 0;
  for (int i = 0; i < fcount; i++)
    if (DeleteFile(files[i].c_str()))
      dcount++;
    else {
      ErrorCode = GetLastError();
      cout << "DeleteFile(" << files[i] << ") failed with error code " <<
        ErrorCode << endl;
    }

  cout << "Deleted files count: " << dcount << endl;
  return 0;
}
Рубрика: программирование | Метки: , | Оставить комментарий

Решение задачи C квалификационного раунда Google Code Jam 2016


Условия задачи «Джемкойны»

Решение для малого набора данных (N = 16, J = 50)

program JamCoin;

uses
  SysUtils;
const
  minBase = 2;
  maxBase = 10;
var
  N: Byte; //total number of digits
  T, i: Byte;
  J: Word;
  NJ: string;
  spacePos: SizeInt;
  bits, mBits: Word;
  b: Byte;
  jj: Word;
  k: Byte;
  num: QWord;
  d: LongWord;
  dcount: Byte;
  divs: array[minBase..maxBase] of LongWord;
  stop: boolean;

function BitSet(bits: Word; i: Byte): boolean;
var
  mask: Word;
begin
  mask:=1 shl i;
  result:=(bits and mask) = mask;
end;

function Number(bits: Word; base: Byte): QWord;
var
  b: Byte;
  i: Byte;
  power: QWord;
begin
  result:=0;
  for b:=0 to N - 1 do
    if BitSet(bits, b) then
    begin
      power:=1;
      for i:=1 to b do
        power:=power * base;
      result:=result + power;
    end;
end;

function Divisor(number: QWord; base: Byte): QWord;
var
  i: QWord;
  last: QWord;
begin
  result:=0;
  i:=2;
  last:=number - 1;
  while i < last do
  begin
    if i Mod base = 0 then
    begin
      Inc(i);
      Continue;
    end;
    if  number Mod i = 0 then
    begin
      result:=i;
      Break;
    end
    else
    begin
      last:=number Div i;
    end;
    Inc(i);
  end;
end;

procedure PrintBits(number: LongWord);
var
  bitCount: Byte;
begin
  bitCount:=0;
  for b:=N - 1 downto 0 do
  begin
    if BitSet(number, b) then
    begin
      Write('1');
      Inc(bitCount);
    end
    else
      Write('0');
  end;
  if bitCount = N then stop:=true;
end;

begin
  Readln(T);
  for i:=1 to T do
  begin
    Readln(NJ);
    spacePos:=Pos(' ', NJ);
    N:=StrToInt(LeftStr(NJ, spacePos - 1));
    J:=StrToInt(RightStr(NJ, Length(NJ) - spacePos));
    Writeln('Case #', i, ':');
    mbits:=0;
    jj:=0;
    while (jj < J) and not stop do
    begin
      dcount:=0;
      while dcount < 9 do begin bits:=1 shl (N - 1) + (mbits shl 1) + 1; for k:=minBase to maxBase do begin num:=Number(bits, k); d:=Divisor(num, k); divs[k]:=d; if d > 0 then
          begin
            Inc(dcount);
          end
          else
          begin
            dcount:=0;
            Break;
          end;
        end;
        Inc(mbits);
      end;
      Inc(jj);
      PrintBits(bits);
      for k:=minBase to maxBase do
        Write(' ', divs[k]);
      Writeln;
    end;
  end;
end.
Рубрика: программирование | Метки: , | Оставить комментарий

Google Code Jam 2016. Задача C квалификационного раунда


Джемкойны

Джемкойн – это строка из N ≥ 2 цифр со следующими свойствами:

  • Используются только цифры 0 и 1.
  • Первая и последняя цифры: 1.
  • Интерпретация строки в любой системе счисления с основанием от 2 до 10 включительно даёт составное (не простое) число.

Читать далее

Рубрика: перевод | Метки: | Оставить комментарий