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

Извлечение корня, длинная арифметика - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти "средний" по величине делитель числа http://www.cyberforum.ru/cpp-beginners/thread363028.html
Надо найти "средний" по величине делитель числа х.Использовать прибавление 1 = + - х :-целочисленное деление и %-остаток от деления. 3.3 Запрещено создавать темы с бессмысленными названиями вроде "Помогите!", "Вопрос" и т.п
C++ странная последовательность Во входном файле записана последовательность чисел в странном формате: у каждого числа сначала записано количество цифр в этом числе, а потом через пробел - сами цифры. Последовательность заканчивается числом 0. В выходной файл нужно вывести сначала количество чисел в последовательности, а потом - сами числа. Количество чисел в последовательности не превышает 1000. В числах - не более 4-х... http://www.cyberforum.ru/cpp-beginners/thread363025.html
Линейные Односвязные Списки С++ C++
Разработать и реализовать программу создания и обработки линейного односвязного списка с одним информационным полем, которое содержит целое число. Программа должна содержать меню с перечнем возможностей работы со списком и выбора соответствующего пункта меню с обращением к функции, реализующей выбранное действие над списком: (меню сама сделаю..мне бы те программки которые ниже..а то я совсем...
написать программу вычисляющие ИМЛ с помощью узлов Чебышева C++
помоги кто чем может а...cout<<"Help me"<<endl;
C++ Задача с вычислениями по формулам http://www.cyberforum.ru/cpp-beginners/thread363004.html
Помогите пожалуйста написать программу для расчёта по двум формулам, результат первой должен совпадать со второй. формулы: {Z}_{1} = \frac{sin2\alpha+sin5\alpha-sin3\alpha}{cos\alpha+1-{2sin}^{2}2\alpha}; {Z}_{2} = 2sin\alpha то есть пользователь вводит величину угла (альфа) например: ввод: 0 вывод: 0.00 0.00
C++ Для данных областей... Для данных областей составить линейную программу , которая печатает true ,если точка с координатами (x,y) принадлежит закрашенной области , и false – в противном случае. подробнее

Показать сообщение отдельно
softmob
1248 / 698 / 155
Регистрация: 20.02.2010
Сообщений: 1,035
08.10.2011, 13:58     Извлечение корня, длинная арифметика
По заданному натуральному числу А требуется найти наибольшее число В такое, что B^2 <= A.

вот набросал, но прога работает медленно. как ее можно оптимизировать или подскажите более быстрый способ.
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <fstream>
#include <string>
#include <deque>
using namespace std;
 
int sravnenie(deque<int>& a,deque<int>& b)
{   
    int lena=a.size(),lenb=b.size();
    if (lena>lenb) return 1;
    if (lena<lenb) return 2;
    if (lena==lenb)
    {
        for (int i=0;i<lena;i++)
        {
            if (a[i]!=b[i])
                if (a[i]>b[i]) 
                    return 1;
                else
                    return 2;
        }
    }
    return 0;
}
 
 
deque<int> slozhenie(deque<int>& a,deque<int>& b)
{  
    if (a.empty()) 
        return b;
    else
    {
        int lena=a.size()-1,lenb=b.size()-1;
        int perenos = 0, achislo, bchislo, summa, i=0;
        deque<int> res;
        do 
        {
            if (lena>=i)
                achislo = a[lena-i];
            else
                achislo = 0;
 
            if (lenb >= i) 
                bchislo = b[lenb-i];
            else
                bchislo = 0;
 
            summa = achislo + bchislo + perenos;
            if (summa >= 10 )
            {
                perenos = summa / 10;
                summa = summa % 10;
            }
            else
            {perenos = 0;}
 
            res.push_front(summa);
            i++;
        }while((lena>=i)||(lenb>=i));
 
        if (perenos > 0)
        {
            res.push_front( perenos);
        }
        return res;
    }
}
 
deque <int> sq2(deque<int>& y)
{
    deque <int> a=y;
    int h=0;
    while( (!a.empty()) && (!a.back()))  {a.pop_back(); h++;}   
 
    int perenos,proizvedenie;
    int lena=a.size()-1;
    deque<int> proizv,res;
    for(int i = lena; i>=0; i--)
    {
        proizv.clear(); 
        perenos = 0;       
 
        for (int j = lena; j>=0; j--)
        {       
            proizvedenie = a[i] * a[j] + perenos;
 
            if (proizvedenie >= 10) 
            {
                perenos = proizvedenie / 10;
                proizvedenie %= 10;
            }
            else
            {perenos = 0;}          
 
            proizv.push_front(proizvedenie);
        }
        if (perenos > 0) {proizv.push_front(perenos);}
        while( (!proizv.empty()) && (!proizv.front()))  {proizv.pop_front();}
        proizv.resize(proizv.size()+lena-i);
        res=slozhenie(res,proizv);
    }    
 
    res.resize(res.size()+2*h);
    return res;
}
 
deque<int> sqrt(deque<int>& a)
{
    int n=(a.size()+1)/2;
    deque<int> r(n);
 
    for(int i=0;i<n;i++)
    {
        for (int j=9;j>=0;j--)
        {
            r[i]=j;
            if (sravnenie(sq2(r),a)!=1) break;
        }
    }
    return r;       
}
 
int main(void)
{   
    string in;
    ifstream fin ("INPUT.TXT"); 
    ofstream fout ("OUTPUT.TXT");
    fin >> in;
    deque<int> a;
    for (unsigned int i=0;i<in.size();i++)  a.push_back(in[i]-48);
    deque<int> rezult=sqrt(a);
    for (unsigned int i=0;i<rezult.size();i++)  fout <<rezult[i];
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru