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

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

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

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

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

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

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

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

Ввод
101
Вывод
5
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 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
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
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
13.05.2012, 13:00     Из 2ой в 10ую #6
Оба предложенных варианта не удовлетворяют постановке задачи. Введите туда двоичное число размером в 1000 символов - и программа не отработает

Работающий исходник см. тут: Перевод чисел из одной системы счисления в другую
Только нужно в main строковые буфера достаточного размера сделать. И переименовать имя функции conv_dec_to_bin и комментарий к ней, т.к. изначально она переводила из 10 в 2, а потом переделал на из любой в любую
diagon
Higher
1928 / 1194 / 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
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 13:13     Из 2ой в 10ую #8
Забыл на ограничения посмотреть =(
На JAva есть длинная арифметика +1 (я slowpoke)
Но на самом деле тут достаточно просто 2 функции взять :
1) возведение двойки в степень (длинное число)
2) сложение 2 длинных чисел
diagon
Higher
1928 / 1194 / 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
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 13:18     Из 2ой в 10ую #10
diagon, А где взять gmp ? http://gmplib.org/ ? Это не стандартная либа?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 13:20     Из 2ой в 10ую #11
Цитата Сообщение от Ternsip Посмотреть сообщение
А где взять gmp ? http://gmplib.org/ ?
Да, тут.

Цитата Сообщение от Ternsip Посмотреть сообщение
Это не стандартная либа?
Нет, не стандартная, нужно ставить самостоятельно.
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
13.05.2012, 15:21     Из 2ой в 10ую #12
java, gmp...
Господа, смысл задачи в том, чтобы самому всё это сделать, а не использовать готовые библиотечные решения
Yandex
Объявления
13.05.2012, 15:21     Из 2ой в 10ую
Ответ Создать тему
Опции темы

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