Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <string.h>
  5. #include <iomanip.h>
  6. #include <math.h>
  7.  
  8. /** Условие:
  9. Составить программу для работы с целыми числами в семеричной системе счисления.
  10. Для хранения таких чисел использовать стандартный тип long int, но ограничиться только цифрами 0,1,2,3,4,5,6.
  11. Например, для переменной k в семеричной системе счисления iо- int к=-126; значение будет равно -69 в десятичной
  12. системе счисления. Учесть, что при таком представлении можно работать только с числами, ограниченными
  13. диапазоном типа long int. В качестве диапазона чисел в семеричной системе счисления можно взять значения
  14. от-2146666666 до 2146666666.
  15.  
  16. В соответствии с условиями задания для лабораторной работы к данному занятию составить функции
  17. для реализации следующих арифметических операций в указанной системе счисления: сложение, вычитание, умножение,
  18. возведение в целую неотрицательную степень. Функции должны отслеживать возможное переполнение. Для чисел а и b,
  19. введенных пользователем в указанной системе счисления, с помощью реализованных функций вычислить
  20. значение выражения а^2b-а(а-b)+а.
  21.  
  22.  */
  23.  
  24. const long int  MAX_7_NUMBER = 2146666666;
  25. const long int MIN_7_NUMBER = -2146666666;
  26.  
  27. int getDigitInNumber(long int x,int digitnum);
  28. void setDigitInNumber(long int &x,int digitnum, int digit);
  29. bool isValid7Numb(long int x);
  30. long int sum(long int a, long int b);
  31. long int sub(long int a, long int b);
  32. long int mul(long int a, long int b);
  33. long int step(long int a,long int step);
  34.  
  35. //Функция получения цифры по позиции в числе
  36. int getDigitInNumber(long int x,int digitnum)
  37. {
  38.     long int digit10=1,tmp = x;
  39.     for (int i =0; i<digitnum-1; i++)
  40.         digit10 *=10;
  41.     return (tmp / digit10) % 10;
  42. }
  43. //Фцнуция для установки значения цифры в числе
  44. void setDigitInNumber(long int &x,int digitnum, int digit)
  45. {
  46.     long int digit10=1;
  47.     for (int i =0; i<digitnum-1; i++)
  48.         digit10 *=10;
  49.     int tmp = getDigitInNumber(x,digitnum);
  50.     x = x - (tmp*digit10) + digit*digit10;
  51. }
  52. //Функция проверки является ли число верным числом в 7 с.с.
  53. bool isValid7Numb(long int x)
  54. {
  55.     char tmp[20];
  56.  
  57.     sprintf(tmp,"%d",x); //Преобразовываем число в строку
  58.     for (int i = 0; i<strlen(tmp); i++) //Цикл по всей строке
  59.         if (!(tmp[i]<='6' && tmp[i]>='0'||tmp[i]=='-')) //Если это не цифры от 0 до 6 или - то
  60.             return false;                               //возвращаем false
  61.     return true; //Если число прошло цикл, то возвращаем true
  62. }
  63.  
  64. long int sum(long int a, long int b)
  65. {
  66.     long int res = 0,tmpa = (int)fabs(a),tmpb = (int)fabs(b);
  67.     int perenos = 0;
  68.     int i = 0;
  69.  
  70.     //Выбираем большее из чисел А и Б
  71.     if (tmpa<tmpb)
  72.     {
  73.       tmpa = (int)fabs(b); //Устанавливаем большее число в tmpA
  74.       tmpb = (int)fabs(a); //Меньшее в tmpB
  75.     }
  76.  
  77.  
  78.     //Проверим нельзя ли заменить сложение вычитанием
  79.     if (a<0&&b>0)
  80.         return sub(b,-1*a);
  81.     else if(a>0&&b<0)
  82.         return sub(a,-1*b);
  83.  
  84.     int znak = (a+b)/((int)fabs(a+b));//Знак выражения
  85.  
  86.     //Проверяем не возникает ли переполнения при сложении чисел
  87.     if (tmpa+tmpb>MAX_7_NUMBER)
  88.     {
  89.         printf("Произошло переполнение! Результат вычисления выражения будет неверен!\n");
  90.         return 0;
  91.     }
  92.  
  93.     while (tmpa!=0||perenos!=0) //Пока число A не равно 0 т.е. пока не все цифры числа А просуммированы или присутствует перенос в старший разряд
  94.     {
  95.         i++;//Позиция в результате для установки результата вычитания
  96.  
  97.         int digitA = getDigitInNumber(tmpa,1);//Достаем последнюю цифру(младший значащий разряд) от числа А
  98.         tmpa = tmpa/10; //Отрезаем последнюю цифру от числа А
  99.  
  100.         int digitB  = getDigitInNumber(tmpb,1);//Достаем последнюю цифру(младший значащий разряд) от числа B
  101.         tmpb = tmpb/10; //Отрезаем последнюю цифру от числа B
  102.  
  103.         int d = (digitA + digitB + perenos) % 7; //Вычисляем результат сложения разрядов с учетом 7 с.с.
  104.         perenos = (digitA + digitB + perenos) / 7; //Вычисляем перенос в старший разряд
  105.  
  106.         setDigitInNumber(res,i,d); //Устанавливаем результат вычитания чисел в позицую i результата
  107.     }
  108.     return res*znak; // Вохвращаем результат сложения с учетом знака
  109. }
  110.  
  111. long int sub(long int a, long int b)
  112. {
  113.     if (a==b) return 0; //Если числа равны то результат вычитания равен нулю
  114.     long int res = 0,
  115.     tmpa = (int)fabs(a), //Берем числа А и B по модулю
  116.     tmpb = (int)fabs(b);
  117.  
  118.     //Проверим нельзя ли заменить вычитание сложением
  119.     if (a<0&&b>0) return -sum(-1*a,b);
  120.     else if(a>0&&b<0) return sum(a,-1*b);
  121.  
  122.     //Найдем максимальное по модулю число  чтобы отнимать от большего меньшее;
  123.     if (fabs(tmpa)<fabs(tmpb))
  124.     {
  125.             tmpa = (int)fabs(b);
  126.             tmpb = (int)fabs(a);
  127.     }
  128.     int i = 0,//Позиция в результате
  129.  
  130.     znak = (a-b)/((int)fabs(a-b));//Знак выражения
  131.  
  132.     while (tmpa!=0) //Пока число A не равно 0 т.е. пока не все цифры отрезаны
  133.     {
  134.         i++;//Позиция в результате для установки результата вычитания
  135.         int digitA = getDigitInNumber(tmpa,1);//Достаем последнюю цифру(младший значащий разряд) от числа А
  136.         tmpa = tmpa/10; //Отрезаем последнюю цифру от числа А
  137.         int digitB  = getDigitInNumber(tmpb,1);//Достаем последнюю цифру(младший значащий разряд) от числа B
  138.         tmpb = tmpb/10; //Отрезаем последнюю цифру от числа B
  139.  
  140.  
  141.         if (tmpa!=0)
  142.             if (digitA<digitB){ //Если число из которого вычитают меньше вычитаемого то заимствуем из старших разрядов
  143.                 //Заимствование из старшего разряда
  144.                 int k = 1; //переменная в которой будем искать ближайший к текущему(i-му) разряду разряд отличный от нуля
  145.                 while (getDigitInNumber(tmpa,k)==0) k++; //Ищем пока не доберемся до первого значящего разряда
  146.  
  147.                 setDigitInNumber(tmpa,k,getDigitInNumber(tmpa,k)-1);//Уменьшили первый найденный значящий разряд на 1
  148.  
  149.                 //Устанавливаем все разряды после занячещего в 6, т.к. из них заимствована 1 до текущего разряда
  150.                 for (int j = k-1; j>0; j--)
  151.                     setDigitInNumber(tmpa,j,6);
  152.                 digitA+=7; //Прибавляем заимствованный десяток к текущему разряду. 7 = 10 в 7ричной с.с.
  153.  
  154.             }
  155.         int d = (digitA - digitB) % 7; //Находим результат вычитания разрядов чисел
  156.         setDigitInNumber(res,i,d); //Устанавливаем результат вычитания чисел в позицую i результата
  157.  
  158.     }
  159.     return znak*res; //Возвращаем результат вычитания с учет ранее найденного знака
  160. }
  161.  
  162. long int mul(long int a, long int b){
  163.  
  164.     if (a==0||b==0) return 0; //Если какой-либо из множителей равен нулю то результат равен нулю
  165.  
  166.     int znak = (int) (a/fabs(a))*(b/fabs(b)); //Находим знак выражения
  167.  
  168.     long int res = 0, //Принимаем резульатт равным нулю т.к. мы заменим умножение сложением
  169.     tmpa = (int)fabs(a), //Берем число А по модулю
  170.     tmpb = (int)fabs(b); //Берем число B по модулю
  171.  
  172.     //Заменяем умножение сложением
  173.     for (long int i = tmpb; i>0; i=sub(i,1)) //Цикл от B до 1
  174.     {
  175.         res = sum(res,tmpa); //Прибавляем число а к результату
  176.     }
  177.     return res * znak;
  178. }
  179.  
  180. long int step(long int a, long int step){
  181.    if (step==0)  return 1;
  182.    if (a==0||a==1) return a;
  183.  
  184.    long int res = 1; //Принимаем резульатт равным еденице
  185.    for (long int i = step; i>0; i = sub(i,1))
  186.    {
  187.        res = mul(res,a);
  188.    }
  189.    return res;
  190. }
  191.  
  192. int main()
  193. {
  194.     setlocale(LC_ALL,"Rus");
  195.  
  196.     printf("Сумма 1000+666: %d\n",sum(1000,666));
  197.     printf("Сумма -1000+666: %d\n",sum(-1000,666));
  198.     printf("Сумма 1000+(-666): %d\n",sum(1000,-666));
  199.     printf("Сумма -1000+(-666): %d\n",sum(-1000,-666));
  200.     printf("Сумма -1+1): %d\n",sum(-1,1));
  201.  
  202.     printf("Разность 1000-666: %d\n",sub(1000,666));
  203.     printf("Разность -1000-666: %d\n",sub(-1000,666));
  204.     printf("Разность 1000-(-666): %d\n",sub(1000,-666));
  205.     printf("Разность -1000-(-666): %d\n",sub(-1000,-666));
  206.  
  207.     printf("Разность 666-(-1000): %d\n",sub(666,-1000));
  208.     printf("Разность -666-(-1000): %d\n",sub(-666,-1000));
  209.  
  210.     printf("Умножение -1*5: %d\n",mul(-1,5));
  211.     printf("Умножение 100*10: %d\n",mul(100,10));
  212.     printf("Умножение -100*10: %d\n",mul(-100,10));
  213.     printf("Умножение 100*(-10): %d\n",mul(100,-10));
  214.     printf("Умножение -100*(-10): %d\n",mul(-100,-10));
  215.  
  216.     printf("Возведение в степень -10^3: %d\n",step(-10,3));
  217.     printf("Возведение в степень -10^2: %d\n",step(-10,2));
  218.     printf("Возведение в степень -10^2: %d\n",step(-10,4));
  219.  
  220.     printf("Сумма 2146666666+666: %d\n",sum(MAX_7_NUMBER,666));
  221.     printf("Сумма -2146666666+666: %d\n",sum(MIN_7_NUMBER,666));
  222.  
  223.     long int a,b; //Объявляем перменные
  224.     //Считываем переменную А с проверкой на правильность
  225.     do
  226.     {
  227.         printf("Введите 1 число в 7 с.с.:");
  228.         scanf("%d",&a);
  229.     }
  230.     while(!isValid7Numb(a));//Цикл выполняется пока вводится число не удовлтворяющее 7 с.с.
  231.  
  232.     //Считываем переменную B с проверкой на правильность
  233.     do
  234.     {
  235.         printf("Введите 2 число в 7 с.с.:");
  236.         scanf("%d",&b);
  237.     }
  238.     while(!isValid7Numb(b));//Цикл выполняется пока вводится число не удовлтворяющее 7 с.с.
  239.  
  240.     //Вычисляем значение выражения из условия задания
  241.     printf("Результат вычисления выражения a^2*b-a*(a-b)+a = %d\n",sum(sub(mul(step(a,2),b),mul(a,sub(a,b))),a)) ;
  242.  
  243.     system("pause");
  244.     return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement