String25. Дана строка, изображающая десятичную запись целого положительного числа. Вывести строку, изображающую двоичную запись этого же числа.
Решение:
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 |
#include <iostream> #include <string> using namespace std; void div2(string& s, int& mem) //Деление на 2 числового значения записанного в строке. Вывод строка делёная на 2 и остаток от деления. { int i; string s2=s; mem=0; for (i=0;i<(int)s.length();++i){ s2[i] = (char)(((((int)(s[i])-48)+10 * mem) / 2)+48); if ((((int)(s[i])-48) % 2) == 1){mem = 1;} else {mem = 0;} }; if (s2[0]=='0'){ s2.erase(0,1);} s.swap(s2); } int main() { string s,temp; cout << "S:"; cin >> s; string srez; int mem=0; for (srez="";!(s.empty());){ div2(s,mem); srez+=char(mem+48); } int i; for (i=0;i<(int)srez.length();++i){ s+=srez[srez.length()-i-1]; cout <<""<<s[i]<<endl; } cout <<"="<<s<<endl; return 0; } |
Решение (мне не нравиться использовать массивы символов в C++, но «народ» требует):
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 |
# include <iostream> # include <windows.h> # include <cmath> # include <fstream> # include <iomanip> using namespace std; const int nmax = 100; //максимальная длинна строки в задании должна быть меньше 255 int main() { SetConsoleCP(1251);//устанавливаем кодировку для консоли cp1251 кириллица SetConsoleOutputCP(1251); char s[nmax]; //объявляем строку s ifstream in ("String25.txt"); //получаем строку из файла String23.txt in.getline(s,sizeof(s)); cout << s << "\n"; char srez[nmax]=""; //объявляем строку в которой мы будем складировать временный результат int mem=0; //кусочек памяти мы сюда будем складывать остаток от деления на 2 тоесть может быть равна 0 или 1 int i; // переменная будет использоваться в счётчиках while(strlen(s)>0){ //пока длинна строки s больше 0 выполняем следующее действие char s2[nmax];// в s2 положим копию строки s и будем работать с s2 //strcpy(s2,s); //s2=s mem = 0; //зануляем мем for (i=0; i<(int)strlen(s); ++i){ s2[i] = (char)(((((int)(s[i])-48)+10 * mem) / 2)+48);//здесь сложный моемент... символ "0" имеет 48 код в кодировке ASCII // символ "1" 49 символ в кодировке ASCII соответственно "9" код 57. (int)s[i] получаем код символа.. если вычесть 48 то мы получим число. if ((((int)(s[i])-48) % 2) == 1){mem = 1;} else {mem = 0;} //теперь по s2[i] = (char)(((((int)(s[i])-48)+10 * mem) / 2)+48);if ((((int)(s[i])-48) % 2) == 1){mem = 1;}else {mem = 0;} // мы берём и по символьно делим число на 2 если есть остаток от деления добавляем его к следующему число в виде десяток //Пример s2="123"; 1/2 = 0 и остаток 1; 2/2, но у нас есть остаток слеовательно 12/2 = 6 остаток 0; 3/2 остатка нет // следовательно 03/2=1 и остаток 1; и того s2="061" и mem=1 }; if (s2[0]=='0') for(i=0; s2[i]!='\0'; ++i) {s2[i]=s2[i+1]; } //если в начале образовался 0 мы его убераем сдвигая слова в лево тоесть "061" после будет "61" strcpy(s,s2);//подготавливаемся к следующему циклу s=s2 srez[strlen(srez)]+=char(mem+48); //записываем остаток от деления в результат } for (i=0;srez[i]!='\0';++i){ //что бы получилась двоичная запись нам надо перевернуть значение переворачиваем srez в s s[i]=srez[strlen(srez)-i-1]; } s[i]='\0';//обозначаем конец строки, что бы хорошо отображалась строка. cout <<"="<<s<<endl; return 0; } |
Другие задачи из раздела String можно посмотреть здесь.
Здраствуйте.
Мне нужны решение задач книги Абрамян 1000 задач толка на С++. Пожалуста
Здравствуйте.
К сожалению не выложенных решений на С++ сейчас у меня очень мало.
Если вам нужно какое-нибудь конкретное решение, можете об этом написать в соответствующем разделе форума. Я попытаюсь вам помочь.