Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

TP / Project / Приложение

.txt
Скачиваний:
18
Добавлен:
10.12.2013
Размер:
12.42 Кб
Скачать
#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]);
}

Соседние файлы в папке Project