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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kenny58
0 / 0 / 0
Регистрация: 21.02.2011
Сообщений: 19
#1

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

12.05.2012, 20:50. Просмотров 729. Ответов 11
Метки нет (Все метки)

Помогите, никак не догоню

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

Ввод
В первой строке содержится исходное число не более чем из 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
6112 / 5715 / 1849
Регистрация: 18.12.2011
Сообщений: 14,597
Завершенные тесты: 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
Эксперт CАвтор FAQ
 Аватар для Evg
17022 / 5427 / 336
Регистрация: 30.03.2009
Сообщений: 14,689
Записей в блоге: 26
13.05.2012, 13:00     Из 2ой в 10ую #6
Оба предложенных варианта не удовлетворяют постановке задачи. Введите туда двоичное число размером в 1000 символов - и программа не отработает

Работающий исходник см. тут: Перевод чисел из одной системы счисления в другую
Только нужно в main строковые буфера достаточного размера сделать. И переименовать имя функции conv_dec_to_bin и комментарий к ней, т.к. изначально она переводила из 10 в 2, а потом переделал на из любой в любую
diagon
Higher
 Аватар для diagon
1921 / 1187 / 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
1921 / 1187 / 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
1921 / 1187 / 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++ Программа которая переводит из 2ой системы в 10ую
2ой замечательный предел
2ой ssd k75de
В строке с++ у каждого слова удалить 2ой символ C++
Pascal Написать программу перевода из 8ой в 10ую сс и обратно

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

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

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