Схема горнера в переводе больших чисел из одной системы счисления в другую - C (СИ)
Формулировка задачи:
Здравствуйте! Очень нужна ваша помощь в написании программы. Есть псевдокод, нужно реализовать на си...
http://www.hse.ru/pubs/lib/data/acce...1%81%D1%82.pdf
Решение задачи: «Схема горнера в переводе больших чисел из одной системы счисления в другую»
textual
Листинг программы
#include<stdio.h> #include<locale.h> #include<conio.h> #include<malloc.h> int fcount(int n, int h) { if(n==0) return 0; int q=n; int i=0; int r; while(q) { r=n%h; q=(n-r)/h; n=q; i++; } return (i-1); } int inverse_vect(int *arr, int count) { int *F = (int*)malloc(count*sizeof(int)); for(int i=0;i<=count;i++) F[i]=arr[i]; for(int i=0;i<=count;i++) arr[count-i]=F[i]; return *arr; } int mul_pol(int *P, int *Q,int *mul,int lP, int lQ) { int mp=lP, mq=lQ; int mPQ=mp+mq; int i,j; for(i=0;i<=mPQ;i++) mul[i]=0; for(i=0;i<mp;i++) for(j=0;j<mq;j++) mul[i+j]+=P[i]*Q[j]; return *mul; } int mul_pol_num_h(int *P, int *Q, int h,int lP, int lQ) { int count=lP+lQ; int *C = (int*)malloc(count*sizeof(int)); mul_pol(P,Q,C,lP,lQ); inverse_vect(C,count); int k=0; Q[k]=C[k]%h; int q=(C[k]-Q[k])/h; while(k<=count) {k++;Q[k]=(C[k]+q)%h; q=(C[k]+q-Q[k])/h;} k=count+1; while(q>0) {Q[k]=q%h; q=(q-Q[k])/h;k=k+1;} count=k-1; inverse_vect(Q,count); printf("\nUG:"); for(int i=0;i<=count;i++) printf("(%d)",Q[i]); return *Q; } int sum_pol(int *R,int *P,int *Q,int lP, int lQ) { int mPQ=lP-lQ; int mQP=lQ-lP; printf("\n%d-------%d\n",mPQ,mQP); 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]);} for(int i=0;i<=lP;i++) { if(mPQ>0&&i<mPQ) R[i]=P[i]; if(mPQ>0&&i>=mPQ) R[i]=P[i]+Q[i-mPQ]; } for(int i=0;i<=lQ;i++) { if(mQP>0&&i<mQP) R[i]=Q[i]; if(mQP>0&&i>=mQP) R[i]=P[i-mQP]+Q[i]; } printf("\n"); for(int i=0;i<=lP;i++) printf("!!%d>", R[i]); return *R; } int sum_pol_num_h(int *P,int *Q,int h,int lP, int lQ,int k) { int *R = (int*)malloc((lP+lQ)*sizeof(int)); sum_pol(R,P,Q,lP,lQ); inverse_vect(R,lP); int t=0,r; for(int i=0;i<=lP;i++) { R[i]=R[i]+t; Q[i]=R[i]; r=Q[i]%h;Q[i]=r;t=(R[i]-r)/h; } while(t) { r=t%h;Q[lP+k]=r;t=(t-r)/h;k++; } inverse_vect(Q,lP); return *Q; } int h_based_rep(int *arr, int n, int h,int count) { int r; /*if(n==0){arr[0]=0; return *arr;}*/ int q=n; int i=0; while(q) { r=n%h; q=(n-r)/h; arr[i]=r; n=q; i++; } return inverse_vect(arr,count); } int hg_based_pol_num(int *a, int h, int g, int z) { int i,k,count; if(h==g) return *a; count=fcount(h,g); int last_hg=count; //count==0?????; int *hg = (int*)malloc(count*sizeof(int)); h_based_rep(hg,h,g,count); printf("\nHG"); for(int i=0;i<=count;i++) printf("!%d", hg[i]); printf("\n"); count=fcount(a[0],g); int last_ug=count; int *ug = (int*)malloc((count)*sizeof(int)); h_based_rep(ug,a[0],g,count); printf("\nUG"); for(int i=0;i<=count;i++) printf("!%d", ug[i]); printf("\n"); /*count=last_hg+last_ug; int *C = (int*)malloc(count*sizeof(int));*/ /*mul_pol(hg,ug,C,last_hg,last_ug);*/ for(k=1;k<z;k++) { mul_pol_num_h(hg,ug,g,last_hg,last_ug); /*printf("\nUG%d ",k); for(i=0;i<=count;i++) printf("%d|", ug[i]);*/ int count2=fcount(a[k],g); /*printf("\n<%d><%d>",a[k],count2);*/ int *ag = (int*)malloc(count2*sizeof(int)); h_based_rep(ag,a[k],g,count2); printf("\nAG%d: ",k); for(i=0;i<=count2;i++) printf("%d| ", ag[i]); sum_pol_num_h(ag,ug,g,last_hg,last_ug,k); } printf("\n"); for(int i=0;i<=count;i++) printf("(%d) ", ug[i]); return *ug; } int main(void) { int h,g,z; setlocale(LC_ALL, "russian"); printf("Перевод больших чисел из одной системы счисления в другую по схеме горнера\n"); printf("Введите h и g"); scanf("%d %d", &h, &g); printf("Введите степень полинома"); scanf("%d", &z); int *a = (int*)malloc(z*sizeof(int)); printf("Заполните массив"); for(int i=0;i<z;i++) scanf("%d", &a[i]); hg_based_pol_num(a,h,g,z); getch(); return 0; }
Объяснение кода листинга программы
Код выполняет перевод больших чисел из одной системы счисления в другую по схеме Горнера. Список функций:
- fcount - функция для подсчета количества цифр в числе
- inverse_vect - функция для инвертирования вектора
- mul_pol - функция для умножения полинома на число
- mul_pol_num_h - функция для умножения полинома на число с учетом разложения на множители
- sum_pol - функция для сложения полинома и числа
- sum_pol_num_h - функция для сложения полинома и числа с учетом разложения на множители
- h_based_rep - функция для представления числа в системе счисления с основанием h
- hg_based_pol_num - функция для перевода полинома из одной системы счисления в другую Список переменных:
- h - основание системы счисления
- g - степень полинома
- z - количество чисел для перевода
- a - массив для хранения чисел
- r - остаток от деления числа на g
- q - частное от деления числа на g
- t - временная переменная для хранения остатка от деления числа на h
- k - счетчик для отображения разложения числа на множители
- mPQ - количество цифр в числе P
- mQP - количество цифр в числе Q
- R - массив для хранения суммы полинома и числа
- P - массив для хранения полинома
- Q - массив для хранения числа
- C - массив для хранения разложения числа на множители
- ug - массив для хранения числа после перевода полинома из одной системы счисления в другую
- ag - массив для хранения числа после разложения числа на множители Пример использования: Введите h и g, например, 10 и 20. Введите степень полинома, например, 3. Введите числа для перевода, например, 123456789. Программа выведет результат перевода числа в систему счисления с основанием 10 и степенью полинома 3: UG: 123|456|789 R: 123 456 789
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д