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

1% от большого числа - C++

Восстановить пароль Регистрация
 
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
16.09.2012, 18:09     1% от большого числа #1
Вводится число 10^6<=N<=10^200
Надо вывести 1% от него.
Кто-нибудь может это решить, я очень много времени потратил впустую...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.09.2012, 18:12     1% от большого числа #2
от степени вычесть двоечку чтоли или что?
что значит вывести? каким образом это число представлено?
IrineK
Заблокирован
16.09.2012, 18:13     1% от большого числа #3
Считайте число строкой.
Ответом будет подстрока, начиная с третьего символа слева и до конца.
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
16.09.2012, 18:25  [ТС]     1% от большого числа #4
Цитата Сообщение от IrineK Посмотреть сообщение
Считайте число строкой.
Ответом будет подстрока, начиная с третьего символа слева и до конца.
Забыл, самое важное написать: если ответ - дробное число, округлить в большую сторону.
Т.е. тут не все так просто... Насчет строки, я догадался конечно-же, но есть множество мелочей, которые стоит учесть, поэтому я создал тему здесь.

Цитата Сообщение от DU Посмотреть сообщение
от степени вычесть двоечку чтоли или что?
что значит вывести? каким образом это число представлено?
Вводится строка, вывести тоже строку.
IrineK
Заблокирован
16.09.2012, 18:30     1% от большого числа #5
если ответ - дробное число, округлить в большую сторону
Ответ - по-прежнему подстрока, начиная с третьего символа слева, но не до конца, а до запятой. Первый символ после запятой проанализировать и соответствующим образом округлить "число-строку".
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
16.09.2012, 18:34  [ТС]     1% от большого числа #6
Цитата Сообщение от IrineK Посмотреть сообщение
Ответ - по-прежнему подстрока, начиная с третьего символа слева, но не до конца, а до запятой. Первый символ после запятой проанализировать и соответствующим образом округлить "число-строку".
Да,согласен с алгоритмом, но можно посмотреть на его реализацию?
IrineK
Заблокирован
16.09.2012, 18:36     1% от большого числа #7
Реализуйте - посмотрим.
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
16.09.2012, 18:49  [ТС]     1% от большого числа #8
Цитата Сообщение от IrineK Посмотреть сообщение
Реализуйте - посмотрим.
Хорошо, есть частичная реализация...
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
52
53
54
55
56
57
58
#include <iostream>
 
using namespace std;
 
int Leng(char a[])
{
    bool isNULL; int i;
    while (isNULL==false)
    {
     if (a[i]==NULL)
     {
       isNULL=true;
       break;
     }
     i++;
    }
    return i;
 
}
 
void numchg(int num, char s[],int l) // Функция, которая обрабатывает строку,при переходе через десяток
{
    char str2[l]; int j=1; bool byte1;
    for (int j=0;j<l;j++)              //если первая цифра 9
    {
        str2[j]='9';
        if (str2[j]!=s[j]) byte1=true;
    }
    if (byte1==true)  //если девятка первая, то "сдвинуть" строку
    {
        s[0]='1';
        while (s[j+1]!=NULL) s[j]='0';
    }
    while (s[num]=='9')
    {
        s[num]='0';
        if (s[num-1]=='9')
        {
            num--;
            numchg(num,s,l);
        }
        else s[num-1]+=1;
        if (s[num-1]=='8') break; 
    }
}
int main()
{
  char str1[202];
  cin >> str1;
  int l=Leng(str1);
  if ((str1[l-2]!='0') || (str1[l-1]!='0'))
  {
     if (str1[l-3]=='9') numchg(l-3,str1,l);
     else str1[l-3]+=1;
  }
  str1[l-1]=NULL; str1[l-2]=NULL;
  cout << str1;
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.09.2012, 18:49     1% от большого числа #9
Цитата Сообщение от IrineK Посмотреть сообщение
Ответом будет подстрока, начиная с третьего символа слева и до конца.
неверно (не стой стороны удаляете цифры). Пока еще 1% от 2000 это 20, а не 00.
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
16.09.2012, 18:52  [ТС]     1% от большого числа #10
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Пока еще 1% от 2000 это 20, а не 00.
Так и выводит...
Проблемы возникают, например если ввести много девяток...
IrineK
Заблокирован
16.09.2012, 18:53     1% от большого числа #11
valeriikozlov, ну-у да-а )
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.09.2012, 18:58     1% от большого числа #12
Цитата Сообщение от MilosedOFF Посмотреть сообщение
Проблемы возникают, например если ввести много девяток...
округляйте начиная с правой строны. Если самый левый элемент окажется больше или равным 10, то его значение делаете равным x%=10. А перед выводом числа выводите 1. Самой число выводите с лева направо, кроме самых 2-х правых цифр.
IrineK
Заблокирован
16.09.2012, 19:29     1% от большого числа #13
Пока не учитывая "проблему 9":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main()
{   int i,len;
    char bigNumber[250], perCent[250];
    std::cin>>bigNumber;
 
    len = strlen(bigNumber);
    for(i=0;i<len-2;i++)
        perCent[i] = bigNumber[i];
    perCent[i] = '\0';
 
    if(bigNumber[len-2]>52) 
        perCent[i-1]++;
 
    std::cout<<perCent;
 
    std::cin.sync();
    std::cin.get();
    return 0;
}
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
16.09.2012, 19:32  [ТС]     1% от большого числа #14
Спасибо всем за ответы, завтра разберусь со всем этим.
IrineK
Заблокирован
16.09.2012, 20:16     1% от большого числа #15
Теперь и девятки построились
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
#include <iostream>
 
int main()
{   int i,len,cur;
    char bigNumber[250], perCent[250];
    std::cin>>bigNumber;
 
    len = strlen(bigNumber);
    for(i=0;i<len-2;i++)
        perCent[i] = bigNumber[i];
    perCent[i] = '\0';
 
    if(bigNumber[len-2]>'4') 
    {   cur = i-1;
        while(perCent[cur]=='9' && cur>-1)
        {   perCent[cur]='0';
            cur--;
        }
 
        if(cur==-1)
        {   perCent[0]='1';
            perCent[len-2]='0';
            perCent[len-1] ='\0';
        }
        else
            perCent[cur]++;
    }
 
    std::cout<<perCent;
 
    std::cin.sync();
    std::cin.get();
    return 0;
}
IrineK
Заблокирован
16.09.2012, 23:58     1% от большого числа #16
Результат выполнения:
Миниатюры
1% от большого числа  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2012, 16:56     1% от большого числа
Еще ссылки по теме:

Модуль большого числа C++
Как сделать алгоритм факториала большого числа? C++
C++ Взять корень из степени большого числа

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

Или воспользуйтесь поиском по форуму:
MilosedOFF
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 50
17.09.2012, 16:56  [ТС]     1% от большого числа #17
Да, но исходная версия не компилировалась чет...
Вот это рабочий вариант:
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
52
53
54
55
56
57
58
#include <iostream>
 
using namespace std;
 
int Leng(char a[])
{
    bool isNULL; int i;
    while (isNULL==false)
    {
     if (a[i]==NULL)
     {
       isNULL=true;
       break;
     }
     i++;
    }
    return i;
 
}
 
int main()
{   int i; int len; int cur;
    char bigNumber[250]; char perCent[250];
    cin>>bigNumber;
 
    len = Leng(bigNumber);
    for(i=0;i<len-2;i++)
        perCent[i] = bigNumber[i];
    //perCent[i] = '\0';
 
    if(bigNumber[len-2]>'0' || bigNumber[len-1]>'0')
    {   cur = i-1;
        while(perCent[cur]=='9' && cur>-1)
        {   perCent[cur]='0';
            cur--;
        }
 
        if(cur==-1)
        {   perCent[0]='1';
            perCent[len-2]='0';
            //perCent[len-1] ='\0';
        }
        else
            perCent[cur]++;
    }
 
   if (cur==-1)
     perCent[len-1]=NULL;
   else
   {
     perCent[len-1]=NULL;
     perCent[len-2]=NULL;
   }
 
   // perCent[len-1]=NULL; perCent[len-2]=NULL;
    cout<<perCent;
    return 0;
}
Спасибо,IrineK!
Yandex
Объявления
17.09.2012, 16:56     1% от большого числа
Ответ Создать тему
Опции темы

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