Схема горнера в переводе больших чисел из одной системы счисления в другую - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Очень нужна ваша помощь в написании программы. Есть псевдокод, нужно реализовать на си... http://www.hse.ru/pubs/lib/data/acce...1%81%D1%82.pdf

Решение задачи: «Схема горнера в переводе больших чисел из одной системы счисления в другую»

textual
Листинг программы
  1. #include<stdio.h>
  2. #include<locale.h>
  3. #include<conio.h>
  4. #include<malloc.h>
  5.  
  6. int fcount(int n, int h)
  7. {   if(n==0) return 0;
  8.     int q=n;
  9.     int i=0;
  10.     int r;
  11.     while(q)
  12.     {
  13.         r=n%h;
  14.         q=(n-r)/h;
  15.         n=q;
  16.         i++;
  17.     }
  18.     return (i-1);
  19. }
  20.  
  21. int inverse_vect(int *arr, int count)
  22. {
  23.     int *F = (int*)malloc(count*sizeof(int));
  24.     for(int i=0;i<=count;i++)
  25.         F[i]=arr[i];
  26.     for(int i=0;i<=count;i++)
  27.         arr[count-i]=F[i];
  28.     return *arr;
  29. }
  30.  
  31. int mul_pol(int *P, int *Q,int *mul,int lP, int lQ)
  32. {
  33.     int mp=lP, mq=lQ;
  34.     int mPQ=mp+mq;
  35.     int i,j;
  36.     for(i=0;i<=mPQ;i++) mul[i]=0;
  37.     for(i=0;i<mp;i++)
  38.         for(j=0;j<mq;j++) mul[i+j]+=P[i]*Q[j];
  39.     return *mul;
  40.  
  41. }
  42.  
  43. int mul_pol_num_h(int *P, int *Q, int h,int lP, int lQ)
  44. {
  45.     int count=lP+lQ;
  46.     int *C = (int*)malloc(count*sizeof(int));
  47.     mul_pol(P,Q,C,lP,lQ);
  48.     inverse_vect(C,count);
  49.     int k=0;
  50.     Q[k]=C[k]%h;
  51.     int q=(C[k]-Q[k])/h;
  52.     while(k<=count)
  53.     {k++;Q[k]=(C[k]+q)%h; q=(C[k]+q-Q[k])/h;}
  54.     k=count+1;
  55.     while(q>0)
  56.     {Q[k]=q%h; q=(q-Q[k])/h;k=k+1;}
  57.     count=k-1;
  58.     inverse_vect(Q,count);
  59.     printf("\nUG:");
  60.     for(int i=0;i<=count;i++) printf("(%d)",Q[i]);
  61.     return *Q;
  62. }
  63.  
  64. int sum_pol(int *R,int *P,int *Q,int lP, int lQ)
  65. {
  66.     int mPQ=lP-lQ;
  67.     int mQP=lQ-lP;
  68.     printf("\n%d-------%d\n",mPQ,mQP);
  69.     for(int i=0;i<=lP;i++) if(mPQ==0) {R[i]=P[i]+Q[i]; printf("R%dP%dQ%d\n", R[i],P[i],Q[i]);}
  70.     for(int i=0;i<=lP;i++)
  71.         {
  72.             if(mPQ>0&&i<mPQ) R[i]=P[i];
  73.             if(mPQ>0&&i>=mPQ) R[i]=P[i]+Q[i-mPQ];
  74.         }
  75.     for(int i=0;i<=lQ;i++)
  76.         {
  77.             if(mQP>0&&i<mQP) R[i]=Q[i];
  78.             if(mQP>0&&i>=mQP) R[i]=P[i-mQP]+Q[i];
  79.         }
  80.         printf("\n");
  81.     for(int i=0;i<=lP;i++) printf("!!%d>", R[i]);
  82.     return *R;
  83. }
  84.  
  85. int sum_pol_num_h(int *P,int *Q,int h,int lP, int lQ,int k)
  86. {
  87.     int *R = (int*)malloc((lP+lQ)*sizeof(int));
  88.     sum_pol(R,P,Q,lP,lQ);
  89.     inverse_vect(R,lP);
  90.     int t=0,r;
  91.     for(int i=0;i<=lP;i++)
  92.     {
  93.         R[i]=R[i]+t; Q[i]=R[i]; r=Q[i]%h;Q[i]=r;t=(R[i]-r)/h;
  94.     }
  95.     while(t)
  96.     {
  97.         r=t%h;Q[lP+k]=r;t=(t-r)/h;k++;
  98.     }
  99.     inverse_vect(Q,lP);
  100.     return *Q;
  101. }
  102.  
  103. int h_based_rep(int *arr, int n, int h,int count)
  104. {
  105.     int r;
  106.     /*if(n==0){arr[0]=0; return *arr;}*/
  107.     int q=n;
  108.     int i=0;
  109.     while(q)
  110.     {
  111.         r=n%h;
  112.         q=(n-r)/h;
  113.         arr[i]=r;
  114.         n=q;
  115.         i++;
  116.     }
  117.     return inverse_vect(arr,count);
  118.  
  119. }
  120.  
  121. int hg_based_pol_num(int *a, int h, int g, int z)
  122. {
  123.     int i,k,count;
  124.     if(h==g) return *a;
  125.     count=fcount(h,g);
  126.     int last_hg=count;
  127.     //count==0?????;
  128.     int *hg = (int*)malloc(count*sizeof(int));
  129.     h_based_rep(hg,h,g,count);
  130.     printf("\nHG");
  131.     for(int i=0;i<=count;i++)
  132.         printf("!%d", hg[i]);
  133.     printf("\n");
  134.     count=fcount(a[0],g);
  135.     int last_ug=count;
  136.     int *ug = (int*)malloc((count)*sizeof(int));
  137.     h_based_rep(ug,a[0],g,count);
  138.     printf("\nUG");
  139.     for(int i=0;i<=count;i++)
  140.         printf("!%d", ug[i]);
  141.     printf("\n");
  142.     /*count=last_hg+last_ug;
  143.     int *C = (int*)malloc(count*sizeof(int));*/
  144.     /*mul_pol(hg,ug,C,last_hg,last_ug);*/
  145.     for(k=1;k<z;k++)
  146.     {
  147.         mul_pol_num_h(hg,ug,g,last_hg,last_ug);
  148.         /*printf("\nUG%d ",k);
  149.         for(i=0;i<=count;i++) printf("%d|", ug[i]);*/
  150.         int count2=fcount(a[k],g);
  151.         /*printf("\n<%d><%d>",a[k],count2);*/
  152.         int *ag = (int*)malloc(count2*sizeof(int));
  153.         h_based_rep(ag,a[k],g,count2);
  154.         printf("\nAG%d: ",k);
  155.         for(i=0;i<=count2;i++) printf("%d| ", ag[i]);
  156.         sum_pol_num_h(ag,ug,g,last_hg,last_ug,k);
  157.     }
  158.     printf("\n");
  159.     for(int i=0;i<=count;i++) printf("(%d) ", ug[i]);
  160.     return *ug;
  161. }
  162.  
  163. int main(void)
  164. {
  165.     int h,g,z;
  166.     setlocale(LC_ALL, "russian");
  167.     printf("Перевод больших чисел из одной системы счисления в другую по схеме горнера\n");
  168.     printf("Введите h и g");
  169.     scanf("%d %d", &h, &g);
  170.     printf("Введите степень полинома");
  171.     scanf("%d", &z);
  172.     int *a = (int*)malloc(z*sizeof(int));
  173.     printf("Заполните массив");
  174.     for(int i=0;i<z;i++)
  175.     scanf("%d", &a[i]);
  176.     hg_based_pol_num(a,h,g,z);
  177.     getch();
  178.     return 0;
  179. }

Объяснение кода листинга программы

Код выполняет перевод больших чисел из одной системы счисления в другую по схеме Горнера. Список функций:

  1. fcount - функция для подсчета количества цифр в числе
  2. inverse_vect - функция для инвертирования вектора
  3. mul_pol - функция для умножения полинома на число
  4. mul_pol_num_h - функция для умножения полинома на число с учетом разложения на множители
  5. sum_pol - функция для сложения полинома и числа
  6. sum_pol_num_h - функция для сложения полинома и числа с учетом разложения на множители
  7. h_based_rep - функция для представления числа в системе счисления с основанием h
  8. hg_based_pol_num - функция для перевода полинома из одной системы счисления в другую Список переменных:
  9. h - основание системы счисления
  10. g - степень полинома
  11. z - количество чисел для перевода
  12. a - массив для хранения чисел
  13. r - остаток от деления числа на g
  14. q - частное от деления числа на g
  15. t - временная переменная для хранения остатка от деления числа на h
  16. k - счетчик для отображения разложения числа на множители
  17. mPQ - количество цифр в числе P
  18. mQP - количество цифр в числе Q
  19. R - массив для хранения суммы полинома и числа
  20. P - массив для хранения полинома
  21. Q - массив для хранения числа
  22. C - массив для хранения разложения числа на множители
  23. ug - массив для хранения числа после перевода полинома из одной системы счисления в другую
  24. ag - массив для хранения числа после разложения числа на множители Пример использования: Введите h и g, например, 10 и 20. Введите степень полинома, например, 3. Введите числа для перевода, например, 123456789. Программа выведет результат перевода числа в систему счисления с основанием 10 и степенью полинома 3: UG: 123|456|789 R: 123 456 789

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы