Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 29.03.2014
Сообщений: 15

Длинная арифметика (возведение в степень)

29.04.2014, 21:59. Показов 4201. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возведение 2 в степень N.
Мой код на СИ.
Выдаёт правильный результат, но при выводе добавляется куча мусора, берущаяся невесть откуда.
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
#include <stdio.h>
#include <stdlib.h>
#define K 10
int main()
{
    FILE *in;
    FILE *out;
    int A[K];
    int i,j,N;
 
    in=freopen("in.txt", "r", stdin);
    out=freopen("out.txt", "w", stdout);
    scanf("%d",&N);
 
    A[0]=1;
 
    for(i=1; i<=K-1; i++) A[i]=0;
 
    int k=0;
    for(i=0; i<=N-1; i++)
    {
        for(j=0; j<=K-1; j++)
        {
            A[j]=A[j]*2 + k;
            k=A[j] / 10;
        }
    }
 
 
 
 
for(i=0;i<=K-1;i++)
    {
       if(A[i] != 0) printf("%d", A[i]);
    }
fclose(in);
fclose(out);
return 0;
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.04.2014, 21:59
Ответы с готовыми решениями:

Длинная арифметика: возведение в степень
Вычислить с помощью алгоритмов длинной арифметики значение числа 3^5000 и представить его в шестнадцатеричной системе счисления. Помогите...

Возведение числа в степень за минимальное количество умножений, не используя возведение в степень (в чем ошибка?)
должно число подводиться в степень за минимальное кол умножения не используя возведение в степень. Помогите, что не так? И почему?...

Длинная арифметика
Доброе время суток. Я разбираю длинную арифметику. И есть некоторые вопросы. К примеру возьмем Сложение. int a, b, length, i=0,...

9
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
30.04.2014, 17:10
4 цикла, чтобы возвести 2 в указанную степень?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main() {
    int degree;
    int step = 1;
    
    scanf("%d", &degree);
    
    for ( int i = 0; i < degree; i++ ) {
        step *= 2;
    }
    printf("%d\n", step);
    
    return 0;
}
Добавлено через 4 минуты
при работе с файлом так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main() {
    FILE *in = fopen("in.txt", "r");
    FILE *out = fopen("out.txt", "w");
    int degree;
    int step = 1;
    
    fscanf(in, "%d", &degree);
 
    for ( int i = 0; i < degree; i++ ) {
        step *= 2;
    }
    fclose(in);
 
    fprintf(out, "%d\n", step);
    fclose(out);
    
    return 0;
}
0
Чорумфанин
346 / 346 / 320
Регистрация: 06.03.2014
Сообщений: 899
30.04.2014, 17:21
цикл для возведения 2 в степень?
C
1
step=step<<degree-1
1
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
30.04.2014, 17:33
kasan, точно! Только step << degree, ибо немного неверно считает
0
1 / 1 / 1
Регистрация: 28.04.2014
Сообщений: 33
30.04.2014, 18:22
Darkrduk,
FILE *in = fopen("in.txt", "r");
что там открывать собрались? in.txt ? а где его создание? ошибка stream!=NULL

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main() {
    FILE *in = fopen("in.txt", "w");
    in = fopen("in.txt", "r");
    FILE *out = fopen("out.txt", "w");
    int degree;
    int step = 1;
    
    fscanf(in, "%d", &degree);
    scanf( "%d", &degree);
    for ( int i = 0; i < degree; i++ ) {
        step *= 2;
    }
    fclose(in);
 
    fprintf(out, "%d\n", step);
    fclose(out);
    
    return 0;
}
вот теперь правильно =)
0
1 / 1 / 0
Регистрация: 29.03.2014
Сообщений: 15
30.04.2014, 19:37  [ТС]
Всё, что вы написали - хорошо, просто, но ведь не зря тема, созданная мной, называется длинная арифметика, если потребуется возвести 2-ку в 1000 степень, то всё, ваши алгоритмы не прокатят, компьютер запнётся. Поэтому я использовал массив, циклически умножаемый поэлементно на 2-ку. Вопрос остаётся прежним: почему при выводе массива (а значит и нужного числа) добавляется куча мусора?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.05.2014, 11:06
Цитата Сообщение от Colobas Посмотреть сообщение
Вопрос остаётся прежним: почему при выводе массива (а значит и нужного числа) добавляется куча мусора?
Вопрос, скорее, можно поставить иначе. Почему в куче мусора все же ИНОГДА присутствует нужное число. Иногода - это когда значение не превосходит размер int.
Попробовал немного исправить.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main()
{
  int i,j,k,n,N,a;
 
  scanf("%d",&N);
  char A[128]= {0}; A[0]= 1;
 
  for(i= 0, n= 1; i < N; i++) {
    for (j= 0, k= 0;  j<n || k; j++) {
      a= A[j] * 2;
      A[j]= a%10 + k;
      k= a / 10;
    }
    n= j+k;
  }
 
  for(i= n-1; i >= 0; i--) printf("%d", A[i]);
  printf ("\n");
  return 0;
}
Добавлено через 9 часов 49 минут
Просто необходимо добавить проверку переполнения.
Ведь 128 десятичных цифр - это всего лишь 2 в степени 422.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#define MAX_D 128
 
int main()
{
  int i,j,k,n,N;
 
  scanf("%d",&N);
  char A[MAX_D]= {0}; A[0]= 1;
 
  for(i= 0, n= 1; i < N ; i++, n= j) {
    for (j= 0, k= 0;  j<n || k; j++) {
      int a= A[j] * 2;
      A[j]= a%10 + k;
      k= a / 10;
    }
    if (n >= MAX_D) return 1;
  }
 
  for (i= n-1; i >= 0; i--) printf("%d", A[i]);
  printf ("\n");
  return 0;
}
1
1 / 1 / 0
Регистрация: 29.03.2014
Сообщений: 15
01.05.2014, 12:02  [ТС]
Цитата Сообщение от gng Посмотреть сообщение
for(i= 0, n= 1; i < N ; i++, n= j) {
* * for (j= 0, k= 0; *j<n || k; j++) {
gng, можете ли вы упростить данный блок вложения?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
01.05.2014, 12:35
Лучший ответ Сообщение было отмечено Colobas как решение

Решение

Не знаю, можно ли это назвать упрощением ...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
  int n= 1, k= 0;
  for(i= 0; i < N ; i++) {
    for (j= 0;  j<n; j++) {
      int a= A[j] * 2;
      A[j]= a%10 + k;
      k= a / 10;
    }
    if (k>0) { 
      A[j]= k; 
      n++; k--;
    }
    if (n >= MAX_D) return 1;
  }
1
1 / 1 / 0
Регистрация: 29.03.2014
Сообщений: 15
01.05.2014, 13:01  [ТС]
gng, благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.05.2014, 13:01
Помогаю со студенческими работами здесь

Длинная арифметика на Си
Здравствуйте, форумчане! Хотелось бы мне начать топик, сообщения в котором я планирую пополнять постоянно (по возможности и уровню...

Длинная арифметика
Необходимо реализовать операции сложения, вычитания и умножения двух чисел a и b. Каждое число содержит не более 10000 десятичных знаков,...

Простая Длинная арифметика
Доброго времени суток! У меня задача. Вводим 3 числа,достаточно больших,чтобы они не помещались в стандартные типы данных. Далее надо...

Умножение (длинная арифметика)
Работа с массивами из десяти элементов в 12-ричной системе, реализация функции умножения Результатом возвращается число, указанное в...

Арифметические действия (длинная арифметика)
Хай програмеры!!!! кто может помогите мне с таким заданием: Написать программу, которая выполняет указанные арифметические действия...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru