Lec_07
.pdfПродолжение решения 7.3
{распечатка результата}
{старшая тетрада выдается без ведущих нулей } j:=1000;
while (A[Nach] div j)=0 do j:=j div 10; while j<>0 do begin
write(A[Nach] div j); A[Nach]:=A[Nach] mod j; j:=j div 10;
end;
for i:=Nach-1 downto 1 do begin j:=1000;
for j:=1 to 4 do begin write(A[i] div j); A[i]:=A[i] mod j; j:=j div 10;
end end
end.
Задачи…
7.4) Дано два целых положительных числа: a и b. Требуется написать программу, которая находит цифру, на которую оканчивается число a^b.
Решение:
нам надо найти ПОСЛЕДНЮЮ цифру a^b.
На последнюю цифру не влияет никакая цифра, кроме последней цифры числа a^(b-1).
Это упрощает задачу. Каждый раз нам следует возводить в степень ТОЛЬКО ПОСЛЕДНЮЮ цифру и при получении числа большего 9 получать ТОЛЬКО ПОСЛЕДНЮЮ цифру.
Проиллюстрируем на примере:
if b > 1 then
for c := 2 to b do begin
last := last * a;
last := last mod 10;
end;
Задачи…
47
7.5) Составить программу вычисления точного значения n^n, где n>10.
Возможности языков по работе с большими числами
48
Delphi
64 битовое целое число - наибольшее в Delphi . Тип Int64 это 64 битовое целое число со знаком.
Этот размер фиксирован, и не будет изменён в будущих выпусках Delphi.
type Int64 = -9223372036854775808..9223372036854775807;
ВDelphi нет бесзнакового типа 64 битного целого числа.
Функции типа IntToStr поддерживают Int64.
Компиляторы C++
49
типа |
Байты |
Диапазон значений |
|
|
|
|
|
int |
4 |
от -2 147 483 648 до 2 147 483 647 |
|
|
|
|
|
__int64 |
8 |
От -9 223 372 036 854 775 808 |
|
до 9 223 372 036 854 775 807 |
|||
|
|
||
|
|
|
|
unsigned __int64 |
8 |
От 0 до 18 446 744 073 709 551 615 |
|
|
|
|
|
unsigned long |
4 |
От 0 до 4 294 967 295 |
|
|
|
|
|
long long |
8 |
От -9 223 372 036 854 775 808 |
|
до 9 223 372 036 854 775 807 |
|||
|
|
||
|
|
|
|
unsigned long long |
8 |
От 0 до 18 446 744 073 709 551 615 |
|
|
|
|
Особенности long long
50
Чтобы присвоить значение переменной типа long long, необходимо приставить к числу две буквы LL (которые видимо символизируют, что число «longlong» 64-битное).
long long temp = 1100LL;
Если складывать два числа int и результат выйдет за диапазон int, то можно использовать long long.
int a1 = 2000000000; int a2 = 2000000000; long long b = a1 + a2;
// b равен 400000000.
Если мы хотим умножить число типа int а на число типа int b, то всё будет выглядеть так.
long long temp = 0;
for (int i = 0; i < a; i++) { temp += b; }
BigInteger - структура C#
51
Структура c# BigInteger является специальным числовым типом, который дает возможность представлять произвольно большие целые числа без потери точности (введен в .net framework 4.0).
C# не обеспечивает естественную поддержку для BigInteger, поэтому изначально нет возможность отображать литералы BigInteger. Однако, можно неявно выполнить преобразование из любого друго целочисленного типа в BigInteger.
Преимуществом хранения подобных чисел в BigInteger по сравнению с массивом byte является то, что вы получаете семантику значимого типа. Вызов ToByteArray преобразует BigInteger обратно в массив byte.
BigInteger twentyFive = 25; |
// не явное преобразование |
BigInteger googol = BigInteger.Pow (10, 100); |
|
double g2 = (double) googol; |
// явное преобразование |
BigInteger g3 = (BigInteger) g2; |
|
Console.WriteLine (g3); |
|
java.Math
Biglnteger и BigDecimal
52
Для преобразования обычного числа в большое используется статический метод valueOf:
Biglnteger а = Biglnteger.valueof(100);
Методы классов для больших чисел:
Biglnteger с = a.add(b); // с = a + b
Biglnteger d = с.multiply(b.add(Biglnteger.valueOf(2))); // d - с * (b + 2);
java.math.BigInteger |
java.mathBigDecimal |
- Biglnteger add(Biglnteger other) |
-BigDecimal add (BigDecimal other) |
- Biglnteger subtract(Biglnteger other) |
- BigDecimal subtract (BigDecimal other) |
- Biglnteger multiply(Biglnteger other) |
- BigDecimal multiply (BigDecimal other) |
- Biglnteger divide(Biglnteger other) |
- BigDecimal divide (BigDecimal other, |
-Biglnteger mod(Biglnteger other) |
int roundingMode) |
- int compareTo(Biglnteger other) |
-int compareTo(BigDecimal other) |
- static Biglnteger vaiueOf(long x) |
- static BigDecimal vaiueOf (long x) |
|
-static BigDecimal vaiueOf (long x, int scale) |
Задачи…
Решение задачи
54
#include <cstdio> int main(){
freopen("j7.in","r",stdin);
freopen("j7.out","w",stdout); int a,b,i; scanf("%d%d",&a,&b);
if (a==1) |
{ |
printf("1"); for(i=1;i<=b;i++) printf("0");
} else {
for(i=a;i<=b;i++) printf("9"); for(i=1;i<a;i++) printf("0");
}
puts(""); return 0;
}