Форум программистов, компьютерный форум CyberForum.ru

Из 2ой в 10ую - C++

Восстановить пароль Регистрация
 
kenny58
0 / 0 / 0
Регистрация: 21.02.2011
Сообщений: 19
12.05.2012, 20:50     Из 2ой в 10ую #1
Помогите, никак не догоню

Задано неотрицательное целое число в двоичной системе счисления. Требуется перевести его в десятичную.

Ввод
В первой строке содержится исходное число не более чем из 50 000 цифр 0 и 1 без ведущих нулей.
Вывод
Вывод должен содержать это число в десятичной системе счисления без ведущих нулей.

Ввод
101
Вывод
5
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
12.05.2012, 20:53     Из 2ой в 10ую #2
задачу взяли с acm.sgu.ru/ ?
kenny58
0 / 0 / 0
Регистрация: 21.02.2011
Сообщений: 19
12.05.2012, 20:58  [ТС]     Из 2ой в 10ую #3
нет, препод по языкам дал, говорит кто к понедельнику покажет, тот молодец
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 1
12.05.2012, 21:03     Из 2ой в 10ую #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int BinstringToInt(char *bin)
{
   int p2=1;
   int iend=strlen(bin)-1;
   int res=bin[iend];
   for(int i=iend-1;i>=0;i--)
   {
         p2*=2;
         res+=p2*bin[i];        
   }
   return p2;
}
int main()
{
     char ss[50000]="1111000110011";
     int r=BinstringToInt(ss);
     char decimal[100];
     itoa(r,decimal,10);
}
кстати тема перевода многократно обсуждалась, например:
Перевод чисел из любой сс в любую
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
12.05.2012, 21:10     Из 2ой в 10ую #5
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
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <fstream>
#include <algorithm>
#include <utility>
#include <stdio.h>
#include <conio.h>
#include <cmath>
using namespace std;
int sp(int j){
    int k=1;
    for (int i=0;i<j;i++)
    k*=2;
    return k;
};
int main(){
    vector <int> ch;
    char x;
    ifstream in("input.txt");
    while (in>>x) {ch.push_back(x-48);};
    int ans=0;
    reverse(ch.begin(),ch.end());
    for (unsigned int i=0;i<ch.size();i++)
        ans+=ch[i]*sp(i);
    cout<<ans;
    getch();
    return 0;
};
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
13.05.2012, 13:00     Из 2ой в 10ую #6
Оба предложенных варианта не удовлетворяют постановке задачи. Введите туда двоичное число размером в 1000 символов - и программа не отработает

Работающий исходник см. тут: Перевод чисел из одной системы счисления в другую
Только нужно в main строковые буфера достаточного размера сделать. И переименовать имя функции conv_dec_to_bin и комментарий к ней, т.к. изначально она переводила из 10 в 2, а потом переделал на из любой в любую
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 13:08     Из 2ой в 10ую #7
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <bitset>
 
int main()
{
    const char * str = "101";
    std::cout << std::bitset< 64 > (str).to_ulong();
}
Хотя нет, для 50к цифр работать не будет...
Можно без проблем написать на стандартной джаве, либо использовать либы вроде gmp.
Если делать самому, то это довольно сложная задача на длинную арифметику.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 13:13     Из 2ой в 10ую #8
Забыл на ограничения посмотреть =(
На JAva есть длинная арифметика +1 (я slowpoke)
Но на самом деле тут достаточно просто 2 функции взять :
1) возведение двойки в степень (длинное число)
2) сложение 2 длинных чисел
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 13:17     Из 2ой в 10ую #9
Так с помощью gmp можно сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <gmp.h>
 
int main()
{
    const char * str = "101";
    
    mpz_t x;
    mpz_init(x);
    
    mpz_set_str(x, str, 2);
    
    gmp_printf("%Zd\n", x);
}
Добавлено через 2 минуты
А так - на Java
Java
1
2
3
4
5
6
7
8
9
10
import java.math.BigInteger;
 
public class Main
{
    public static void main(String[] args)
    {
        String str = "101";
        System.out.println( new BigInteger(str, 2) );
    }
}
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 13:18     Из 2ой в 10ую #10
diagon, А где взять gmp ? http://gmplib.org/ ? Это не стандартная либа?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 13:20     Из 2ой в 10ую #11
Цитата Сообщение от Ternsip Посмотреть сообщение
А где взять gmp ? http://gmplib.org/ ?
Да, тут.

Цитата Сообщение от Ternsip Посмотреть сообщение
Это не стандартная либа?
Нет, не стандартная, нужно ставить самостоятельно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2012, 15:21     Из 2ой в 10ую
Еще ссылки по теме:

C++ Создать функцию, меняющую местами в одномерном массиве 1ый элемент с последним, 2ой с предпоследним и т.д
C++ Программа которая переводит из 2ой системы в 10ую
В строке с++ у каждого слова удалить 2ой символ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
13.05.2012, 15:21     Из 2ой в 10ую #12
java, gmp...
Господа, смысл задачи в том, чтобы самому всё это сделать, а не использовать готовые библиотечные решения
Yandex
Объявления
13.05.2012, 15:21     Из 2ой в 10ую
Ответ Создать тему
Опции темы

Текущее время: 03:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru