Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <string.h>
- #include <iomanip.h>
- #include <math.h>
- /** Условие:
- Составить программу для работы с целыми числами в семеричной системе счисления.
- Для хранения таких чисел использовать стандартный тип long int, но ограничиться только цифрами 0,1,2,3,4,5,6.
- Например, для переменной k в семеричной системе счисления iо- int к=-126; значение будет равно -69 в десятичной
- системе счисления. Учесть, что при таком представлении можно работать только с числами, ограниченными
- диапазоном типа long int. В качестве диапазона чисел в семеричной системе счисления можно взять значения
- от-2146666666 до 2146666666.
- В соответствии с условиями задания для лабораторной работы к данному занятию составить функции
- для реализации следующих арифметических операций в указанной системе счисления: сложение, вычитание, умножение,
- возведение в целую неотрицательную степень. Функции должны отслеживать возможное переполнение. Для чисел а и b,
- введенных пользователем в указанной системе счисления, с помощью реализованных функций вычислить
- значение выражения а^2b-а(а-b)+а.
- */
- const long int MAX_7_NUMBER = 2146666666;
- const long int MIN_7_NUMBER = -2146666666;
- int getDigitInNumber(long int x,int digitnum);
- void setDigitInNumber(long int &x,int digitnum, int digit);
- bool isValid7Numb(long int x);
- long int sum(long int a, long int b);
- long int sub(long int a, long int b);
- long int mul(long int a, long int b);
- long int step(long int a,long int step);
- //Функция получения цифры по позиции в числе
- int getDigitInNumber(long int x,int digitnum)
- {
- long int digit10=1,tmp = x;
- for (int i =0; i<digitnum-1; i++)
- digit10 *=10;
- return (tmp / digit10) % 10;
- }
- //Фцнуция для установки значения цифры в числе
- void setDigitInNumber(long int &x,int digitnum, int digit)
- {
- long int digit10=1;
- for (int i =0; i<digitnum-1; i++)
- digit10 *=10;
- int tmp = getDigitInNumber(x,digitnum);
- x = x - (tmp*digit10) + digit*digit10;
- }
- //Функция проверки является ли число верным числом в 7 с.с.
- bool isValid7Numb(long int x)
- {
- char tmp[20];
- sprintf(tmp,"%d",x); //Преобразовываем число в строку
- for (int i = 0; i<strlen(tmp); i++) //Цикл по всей строке
- if (!(tmp[i]<='6' && tmp[i]>='0'||tmp[i]=='-')) //Если это не цифры от 0 до 6 или - то
- return false; //возвращаем false
- return true; //Если число прошло цикл, то возвращаем true
- }
- long int sum(long int a, long int b)
- {
- long int res = 0,tmpa = (int)fabs(a),tmpb = (int)fabs(b);
- int perenos = 0;
- int i = 0;
- //Выбираем большее из чисел А и Б
- if (tmpa<tmpb)
- {
- tmpa = (int)fabs(b); //Устанавливаем большее число в tmpA
- tmpb = (int)fabs(a); //Меньшее в tmpB
- }
- //Проверим нельзя ли заменить сложение вычитанием
- if (a<0&&b>0)
- return sub(b,-1*a);
- else if(a>0&&b<0)
- return sub(a,-1*b);
- int znak = (a+b)/((int)fabs(a+b));//Знак выражения
- //Проверяем не возникает ли переполнения при сложении чисел
- if (tmpa+tmpb>MAX_7_NUMBER)
- {
- printf("Произошло переполнение! Результат вычисления выражения будет неверен!\n");
- return 0;
- }
- while (tmpa!=0||perenos!=0) //Пока число A не равно 0 т.е. пока не все цифры числа А просуммированы или присутствует перенос в старший разряд
- {
- i++;//Позиция в результате для установки результата вычитания
- int digitA = getDigitInNumber(tmpa,1);//Достаем последнюю цифру(младший значащий разряд) от числа А
- tmpa = tmpa/10; //Отрезаем последнюю цифру от числа А
- int digitB = getDigitInNumber(tmpb,1);//Достаем последнюю цифру(младший значащий разряд) от числа B
- tmpb = tmpb/10; //Отрезаем последнюю цифру от числа B
- int d = (digitA + digitB + perenos) % 7; //Вычисляем результат сложения разрядов с учетом 7 с.с.
- perenos = (digitA + digitB + perenos) / 7; //Вычисляем перенос в старший разряд
- setDigitInNumber(res,i,d); //Устанавливаем результат вычитания чисел в позицую i результата
- }
- return res*znak; // Вохвращаем результат сложения с учетом знака
- }
- long int sub(long int a, long int b)
- {
- if (a==b) return 0; //Если числа равны то результат вычитания равен нулю
- long int res = 0,
- tmpa = (int)fabs(a), //Берем числа А и B по модулю
- tmpb = (int)fabs(b);
- //Проверим нельзя ли заменить вычитание сложением
- if (a<0&&b>0) return -sum(-1*a,b);
- else if(a>0&&b<0) return sum(a,-1*b);
- //Найдем максимальное по модулю число чтобы отнимать от большего меньшее;
- if (fabs(tmpa)<fabs(tmpb))
- {
- tmpa = (int)fabs(b);
- tmpb = (int)fabs(a);
- }
- int i = 0,//Позиция в результате
- znak = (a-b)/((int)fabs(a-b));//Знак выражения
- while (tmpa!=0) //Пока число A не равно 0 т.е. пока не все цифры отрезаны
- {
- i++;//Позиция в результате для установки результата вычитания
- int digitA = getDigitInNumber(tmpa,1);//Достаем последнюю цифру(младший значащий разряд) от числа А
- tmpa = tmpa/10; //Отрезаем последнюю цифру от числа А
- int digitB = getDigitInNumber(tmpb,1);//Достаем последнюю цифру(младший значащий разряд) от числа B
- tmpb = tmpb/10; //Отрезаем последнюю цифру от числа B
- if (tmpa!=0)
- if (digitA<digitB){ //Если число из которого вычитают меньше вычитаемого то заимствуем из старших разрядов
- //Заимствование из старшего разряда
- int k = 1; //переменная в которой будем искать ближайший к текущему(i-му) разряду разряд отличный от нуля
- while (getDigitInNumber(tmpa,k)==0) k++; //Ищем пока не доберемся до первого значящего разряда
- setDigitInNumber(tmpa,k,getDigitInNumber(tmpa,k)-1);//Уменьшили первый найденный значящий разряд на 1
- //Устанавливаем все разряды после занячещего в 6, т.к. из них заимствована 1 до текущего разряда
- for (int j = k-1; j>0; j--)
- setDigitInNumber(tmpa,j,6);
- digitA+=7; //Прибавляем заимствованный десяток к текущему разряду. 7 = 10 в 7ричной с.с.
- }
- int d = (digitA - digitB) % 7; //Находим результат вычитания разрядов чисел
- setDigitInNumber(res,i,d); //Устанавливаем результат вычитания чисел в позицую i результата
- }
- return znak*res; //Возвращаем результат вычитания с учет ранее найденного знака
- }
- long int mul(long int a, long int b){
- if (a==0||b==0) return 0; //Если какой-либо из множителей равен нулю то результат равен нулю
- int znak = (int) (a/fabs(a))*(b/fabs(b)); //Находим знак выражения
- long int res = 0, //Принимаем резульатт равным нулю т.к. мы заменим умножение сложением
- tmpa = (int)fabs(a), //Берем число А по модулю
- tmpb = (int)fabs(b); //Берем число B по модулю
- //Заменяем умножение сложением
- for (long int i = tmpb; i>0; i=sub(i,1)) //Цикл от B до 1
- {
- res = sum(res,tmpa); //Прибавляем число а к результату
- }
- return res * znak;
- }
- long int step(long int a, long int step){
- if (step==0) return 1;
- if (a==0||a==1) return a;
- long int res = 1; //Принимаем резульатт равным еденице
- for (long int i = step; i>0; i = sub(i,1))
- {
- res = mul(res,a);
- }
- return res;
- }
- int main()
- {
- setlocale(LC_ALL,"Rus");
- printf("Сумма 1000+666: %d\n",sum(1000,666));
- printf("Сумма -1000+666: %d\n",sum(-1000,666));
- printf("Сумма 1000+(-666): %d\n",sum(1000,-666));
- printf("Сумма -1000+(-666): %d\n",sum(-1000,-666));
- printf("Сумма -1+1): %d\n",sum(-1,1));
- printf("Разность 1000-666: %d\n",sub(1000,666));
- printf("Разность -1000-666: %d\n",sub(-1000,666));
- printf("Разность 1000-(-666): %d\n",sub(1000,-666));
- printf("Разность -1000-(-666): %d\n",sub(-1000,-666));
- printf("Разность 666-(-1000): %d\n",sub(666,-1000));
- printf("Разность -666-(-1000): %d\n",sub(-666,-1000));
- printf("Умножение -1*5: %d\n",mul(-1,5));
- printf("Умножение 100*10: %d\n",mul(100,10));
- printf("Умножение -100*10: %d\n",mul(-100,10));
- printf("Умножение 100*(-10): %d\n",mul(100,-10));
- printf("Умножение -100*(-10): %d\n",mul(-100,-10));
- printf("Возведение в степень -10^3: %d\n",step(-10,3));
- printf("Возведение в степень -10^2: %d\n",step(-10,2));
- printf("Возведение в степень -10^2: %d\n",step(-10,4));
- printf("Сумма 2146666666+666: %d\n",sum(MAX_7_NUMBER,666));
- printf("Сумма -2146666666+666: %d\n",sum(MIN_7_NUMBER,666));
- long int a,b; //Объявляем перменные
- //Считываем переменную А с проверкой на правильность
- do
- {
- printf("Введите 1 число в 7 с.с.:");
- scanf("%d",&a);
- }
- while(!isValid7Numb(a));//Цикл выполняется пока вводится число не удовлтворяющее 7 с.с.
- //Считываем переменную B с проверкой на правильность
- do
- {
- printf("Введите 2 число в 7 с.с.:");
- scanf("%d",&b);
- }
- while(!isValid7Numb(b));//Цикл выполняется пока вводится число не удовлтворяющее 7 с.с.
- //Вычисляем значение выражения из условия задания
- printf("Результат вычисления выражения a^2*b-a*(a-b)+a = %d\n",sum(sub(mul(step(a,2),b),mul(a,sub(a,b))),a)) ;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement