Добавил:
bagiwow
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
void print();
void vvod(char *ar, int &n);
void nol(char *ar, int &m, int n);
void slogenie(char a[], int &n, char b[], int m);
void vichitanie(char a[], int &n, char b[], int &m);
void umnogenie(char a[], int &n, char b[], int m);
bool bolshe(char a[], int na, char b[], int nb);
bool ravno(char a[], int na, char b[], int nb);
void pervl(char a[], int na, char b[], int nb, char l[], int &nl);
char sqr(char l[]);
char podbor(char b[], int nb, char m[], int &nm, char l[], int nl);
void stepen();
void factorial();
void print();
int main()
{
char s; // Нажатая клавиша
char
a[1000],
b[1000],
c[1000], // Частное
m[1000], // Вычитаемое
l[1000]; // Остаток
int
na,nb,nc,nm,nl; // Число цифр
int i,j,start;
int h,t,k;
char temp[1];
for(;;) {
do {
print(); s = getch(); printf("\n");
} while(!isdigit(s));
switch(s) {
case '1':
printf("Сложение\n");
// Инициализация
vvod(a, na);
vvod(b, nb);
// Сложение
slogenie(a,na,b,nb);
// Вывод ответа
printf("Ответ: ");
for(i=0; i<na; i++)
printf("%d",a[i]);
break;
case '2':
printf("Вычитание\n");
// Инициализация
vvod(a, na);
vvod(b, nb);
// Вычитание
vichitanie(a,na,b,nb);
// Вывод ответа
printf("Ответ: ");
for(i=0; i<na; i++)
printf("%d",a[i]);
break;
case '3':
printf("Умножение\n");
// Инициализация
vvod(a, na);
vvod(b, nb);
// Сложение
umnogenie(a,na,b,nb);
// Вывод ответа
printf("Ответ: ");
for(i=0; i<na; i++)
printf("%d",a[i]);
break;
case '4':
printf("Деление\n");
// Инициализация
vvod(a,na);
vvod(b,nb);
nc = 0;
c[0] = 0; // В случае деления на большее число
// Первая цифра
pervl(a,na,b,nb,l,nl);
for (i=0; i<nb; i++)
m[i] = b[i];
nm = nb;
start = nl;
if (!(ravno(l,nl,a,na) && bolshe(b,nb,a,na))) {
for (i=0; bolshe(l,nl,m,nm) || ravno(l,nl,m,nm); i++)
vichitanie(l,nl,m,nm);
c[nc] = i;
}
nc++;
// Следуущие цифры
for (i=start; i<na; i++) {
l[nl] = a[i]; nl++;
while(l[0]==0) {
for(j=0; j<nl-1; j++)
l[j]=l[j+1];
if(nl!=1) nl--; else break;
}
for (j=0; bolshe(l,nl,m,nm) || ravno(l,nl,m,nm); j++)
vichitanie(l,nl,m,nm);
c[nc] = j; nc++;
}
// Ответ
printf("Ответ: ");
for (i=0; i<nc; i++)
printf("%d",c[i]);
printf("\n");
printf("Остаток: ");
for (i=0; i<nl; i++)
printf("%d",l[i]);
break;
case '5':
printf("Корень квадратный\n");
// Инициализация
vvod(a,na);
printf("Введите точность: ");
scanf("%d",&t);
nl = 0;
// Дополняем нулями
if (na%2==1){
for (i=na; i>0; i--)
a[i] = a[i-1];
a[0] = 0;
na++;
}
// Первое l, m и b[0]
l[0] = a[0];
l[1] = a[1];
nl = 2;
b[0] = sqr(l);
nb = 1;
m[0] = b[0]*b[0]/10;
m[1] = b[0]*b[0]%10;
nm = 2;
// Корень целой части
for (i=2, nb=1; i<na; i+=2, nb++) {
vichitanie(l,nl,m,nm);
l[nl] = a[i];
l[nl+1] = a[i+1];
nl+=2;
while(l[0]==0) {
for(h=0; h<nl-1; h++)
l[h]=l[h+1];
if(nl!=1) nl--; else break;
}
b[nb] = podbor(b,nb,m,nm,l,nl);
temp[0] = b[nb];
umnogenie(m,nm,temp,1);
}
// Вывод целой части
printf("Ответ: ");
for (i=0; i<nb; i++)
printf("%d",b[i]);
j = nb;
// Корень дробной части
for (i=0; i<t; i++, nb++) {
vichitanie(l,nl,m,nm);
l[nl] = l[nl+1] = 0;
nl+=2;
while(l[0]==0) {
for(h=0; h<nl-1; h++)
l[h]=l[h+1];
if(nl!=1) nl--; else break;
}
b[nb] = podbor(b,nb,m,nm,l,nl);
temp[0] = b[nb];
umnogenie(m,nm,temp,1);
}
// Вывод дробной части
printf(",");
for (i=j; i<nb; i++)
printf("%d",b[i]);
break;
case '6': stepen(); break;
case '7': factorial(); break;
case '0': exit(0); break;
}
printf("\n\n");
}
return 0;
}
// Вывод меню
void print()
{
printf(" 1 Сложение\n");
printf(" 2 Вычитание\n");
printf(" 3 Умножение\n");
printf(" 4 Деление\n");
printf(" 5 Корень\n");
printf(" 6 Степень\n");
printf(" 7 Факториал\n");
printf(" 0 Выход\n");
}
//Ввод данных
void vvod(char *ar, int &n)
{
int i=0;
printf("Введите число: ");
ar[i]=getchar();
while(ar[i]!='\n') {
i++;
ar[i]=getchar();
}
n=i;
for(i=0; i<n; i++) ar[i]-=48;
}
// Дополняем нулями
void nol(char *ar, int &m, int n)
{
int i,j;
for(i=0; i<n-m; i++)
for(j=n-1; j>0; j--)
ar[j]=ar[j-1];
for(i=0; i<n-m; i++)
ar[i]=0;
m=n;
}
// Слоежение
void slogenie(char a[], int &n, char b[], int m)
{
char c[1000];
int i,j,l,o;
// Дополняем нулями
if(n>m) nol(b,m,n);
else if(n<m) nol(a,n,m);
// Обнуляем резултат
for(i=0; i<n+1; i++)
c[i]=0;
// Сложение
o=0; l=0;
for(j=n; j>0; j--) {
c[j]+=(a[j-1] + b[j-1] + o)%10;
if(c[j]>9) {
l=1;
c[j]=c[j]%10;
}
o=(a[j-1] + b[j-1] + o)/10+l;
if(j==1) c[0]+=o;
l=0;
}
// Избавляемся от ведущих нулей
while(c[0]==0) {
for(j=0; j<n; j++)
c[j]=c[j+1];
if(n!=0) n--; else break;
}
while(b[0]==0) {
for(j=0; j<m-1; j++)
b[j]=b[j+1];
if(m!=1) m--; else break;
}
n++;
// Вывод результата
for(i=0; i<n; i++)
a[i] = c[i];
}
// Вычитание
void vichitanie(char a[], int &n, char b[], int &m)
{
char c[1000];
int i,j,o;
//Дополняем нулями
if(n>m) nol(b,m,n);
else if(n<m) nol(a,n,m);
//Обнуляем резултат
for(i=0; i<n; i++)
c[i]=0;
//Вычитание
o=0;
for(j=n-1; j>=0; j--) {
c[j] += a[j] - b[j] + o;
o=0;
if(c[j]<0) {
o=-1;
c[j]=10 + c[j];
}
}
//Избавляемся от ведущих нулей
while(c[0]==0) {
for(j=0; j<n-1; j++)
c[j]=c[j+1];
if(n!=1) n--; else break;
}
while(b[0]==0) {
for(j=0; j<m-1; j++)
b[j]=b[j+1];
if(m!=1) m--; else break;
}
//Вывод результата
for(i=0; i<n; i++)
a[i] = c[i];
}
// Умножение
void umnogenie(char a[], int &n, char b[], int m)
{
char c[1000];
int i,j,l,o;
//Обнуляем резултат
for(i=0; i<n+m; i++)
c[i]=0;
//Умножение
for(i=0; i<m; i++) {
o=0; l=0;
for(j=n-1; j>=0; j--) {
c[j+m-i]+=(a[j]*b[m-1-i] + o)%10;
if(c[j+m-i]>9) {
l=c[j+m-i]/10;
c[j+m-i]=c[j+m-i]%10;
}
o=(a[j]*b[m-i-1] + o)/10+l;
if(j==0) c[j+m-1-i]+=o;
l=0;
}
}
//Избавляемся от ведущих нулей
n=n+m;
while(c[0]==0) {
for(j=0; j<n-1; j++)
c[j]=c[j+1];
if(n!=1) n--; else break;
}
//Вывод результата
for(i=0; i<n; i++)
a[i] = c[i];
}
// Больше
bool bolshe(char a[], int na, char b[], int nb)
{
int i;
if (na>nb) return true;
else if (nb>na) return false;
else
for (i=0; i<na; i++)
if (a[i]>b[i]) return true;
else if (b[i]>a[i]) return false;
return false;
}
// Равно
bool ravno(char a[], int na, char b[], int nb)
{
int i;
if (na!=nb) return false;
else
for (i=0; i<na; i++)
if (a[i]!=b[i]) return false;
return true;
}
// Первое вычитаемое
void pervl(char a[], int na, char b[], int nb, char l[], int &nl)
{
int i;
if (bolshe(b,nb,a,na)) {
for (i=0; i<na; i++)
l[i] = a[i];
nl = na;
} else {
for (i=0; i<nb; i++)
l[i] = a[i];
nl = nb;
if (bolshe(b,nb,l,nl)) {
l[nl] = a[nl];
nl++;
}
}
}
// Подбор квадрата
char sqr(char l[])
{
int num, k;
num = l[0]*10 + l[1];
for (k=0; k*k<num; k++) ;
return k*k>num ? k-1 : k;
}
// Подбор следующей цифры
char podbor(char b[], int nb, char m[], int &nm, char l[], int nl)
{
int i,j,h,k;
char temp[1000], num[1];
// Получаем следующее m
temp[0] = 2;
for (i=0; i<nb; i++)
m[i] = b[i];
nm = nb;
umnogenie(m,nm,temp,1);
// Собственно сам подбор
for (i=0; i<=10; i++) {
for(j=0; j<nm; j++)
temp[j] = m[j];
k=nm;
num[0] = temp[k] = i;
k++;
umnogenie(temp,k,num,1);
if (bolshe(temp,k,l,nl) || ravno(temp,k,l,nl)) break;
}
if (bolshe(temp,k,l,nl)) m[nm] = i-1;
else m[nm] = i;
nm++;
return m[nm-1];
}
// Степень
void stepen()
{
int iar[100],otv[100000],a,b,e,d,n,o;
int c[100000],i,j,l;
otv[0] = iar[0] = 0;
e = d = 1;
printf("x^y\n");
printf("a: "); scanf("%d", &a);
printf("b: "); scanf("%d", &b);
//Переводим а в массив
i = 0; n = a;
while(n>0) {
o = n%10;
for(j=i; j>0; j--) iar[j] = iar[j-1];
iar[0] = o;
n = n/10;
i++;
e = d = i;
}
for(j=0; j<i; j++) otv[j] = iar[j];
//Возведение в степень
for(n=1; n<b; n++) {
//Обнуляем резултат
for(i=0; i<e+d; i++) c[i]=0;
//Умножение
for(i=0; i<d; i++) {
o=0; l=0;
for(j=e-1; j>=0; j--) {
c[j+d-i]+=(otv[j]*iar[d-1-i] + o)%10;
if(c[j+d-i]>9) {l=c[j+d-i]/10; c[j+d-i]=c[j+d-i]%10;}
o=(otv[j]*iar[d-i-1] + o)/10+l;
if(j==0) c[j+d-1-i]+=o;
l=0;
}
}
//Избавляемся от ведущих нулей
e=e+d;
while(c[0]==0) {
for(j=0; j<e-1; j++) c[j]=c[j+1];
if(e!=1) e--; else break;
}
//Выводим ответ в a[]
for(i=0; i<e; i++) otv[i] = c[i];
}
if(b==0) printf("Ответ: 1");
else {
printf("Ответ: ");
for(i=0; i<e; i++) printf("%d",otv[i]);
}
}
// Факториал
void factorial()
{
int odin[10],iar[100],otv[100000],
n, // n Факториал
e, // Цифр в otv[]
d, // Цифр в iar[]
f, // Цифр в odin[]
k;
int c[100000],i,j,l,o;
iar[0] = otv[0] = 1;
odin[0] = 1;
e = d = f = 1;
printf("n!, n: ");
scanf("%d", &n);
//Факториал
for(k=0; k<n; k++) {
//Обнуляем резултат
for(i=0; i<e+d; i++) c[i]=0;
//Умножение
for(i=0; i<d; i++) {
o=0; l=0;
for(j=e-1; j>=0; j--) {
c[j+d-i]+=(otv[j]*iar[d-1-i] + o)%10;
if(c[j+d-i]>9) {l=c[j+d-i]/10; c[j+d-i]=c[j+d-i]%10;}
o=(otv[j]*iar[d-i-1] + o)/10+l;
if(j==0) c[j+d-1-i]+=o;
l=0;
}
}
//Избавляемся от ведущих нулей
e=e+d;
while(c[0]==0) {
for(j=0; j<e-1; j++) c[j]=c[j+1];
if(e!=1) e--; else break;
}
//Выводим ответ в otv[]
for(i=0; i<e; i++) otv[i] = c[i];
//Дополняем нулями
if(d>f) {
for(i=0; i<d-f; i++)
for(j=d-1; j>0; j--)
odin[j]=odin[j-1];
for(i=0; i<d-f; i++)
odin[i]=0;
f=d;
}
//Обнуляем резултат
for(i=0; i<d+1; i++) c[i]=0;
//Сложение
o=0; l=0;
for(j=d; j>0; j--) {
c[j]+=(iar[j-1] + odin[j-1] + o)%10;
if(c[j]>9) {l=1; c[j]=c[j]%10;}
o=(iar[j-1] + odin[j-1] + o)/10+l;
if(j==1) c[0]+=o;
l=0;
}
//Избавляемся от ведущих нулей
while(c[0]==0) {
for(j=0; j<d; j++) c[j]=c[j+1];
if(d!=0) d--; else break;
}
while(odin[0]==0) {
for(j=0; j<f-1; j++) odin[j]=odin[j+1];
if(f!=1) f--; else break;
}
//Выводим ответ в iar[]
d++;
for(i=0; i<=d; i++) iar[i] = c[i];
}
printf("Ответ: ");
for(i=0; i<e; i++) printf("%d",otv[i]);
}