Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2

Найти последнюю цифру a^b

10.04.2011, 16:55. Показов 9207. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В input.txt лежат а и b-число и степень.
В output.txt нужно вывести последнюю цифру a^b.
a и b не превышают 10000.
Должно быть какое-то простое решение, но я не могу до него додуматься...
Есть, конечно, закономерности, например 54 в нечетной степени оканчивается на 4, а в четной на 6, но беда в том, что для каждого числа эти закономерности разные...
Выявлять эти закономерности или умножать числа, хранящиеся в строках слишком муторно, должно быть более простое решение...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.04.2011, 16:55
Ответы с готовыми решениями:

Найти последнюю цифру.
кто знает, как найти последнюю цифру какого-либо числа?

Найти последнюю цифру заданного числа
дано n натуральное число. Напишите такую программу которая будет вычислять последнюю цифру данного числа.

Найти последнюю цифру при возведении в степень
найти последную цифру A^B. 1<=A<=1000 и 1<=B<=10^9 ввод данных 24 9 ввод данных 4

17
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
10.04.2011, 16:58
Самое простое: взять последнюю цифру а и ее возводить в степень.
Потом от результата брать последнюю цифру.
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.04.2011, 17:02  [ТС]
Видел такое, но, к примеру, 24 в 9й степени оканчивается на 4.
По такому алгоритму берем 4, возводим в квадрат, получаем 16.
Берем последнюю цифру-6, возводим в квадрат, получаем 36.
Из 6 будет получатся 36, это замкнутый круг, и четверки в нем не видно.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
10.04.2011, 17:09
Значит, нужно выявлять закономерности.
Одна - налицо: что закачивается на 0,1,5,6 - в любой степени на них и заканчивается
Все остальное - к этому приводится через несколько шагов.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
10.04.2011, 17:10
diagon, Всё проще
C
1
printf("%d", (int)pow((double)(a % 10), (double)b)) % 10);
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.04.2011, 17:16  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
diagon, Всё проще
C
1
printf("%d", (int)pow((double)(a % 10), (double)b) % 10);
Хм... Не совсем понятен алгоритм
Зачем возводить в степень последние числа?

Добавлено через 3 минуты
Все, дошло.
Спасибо!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
10.04.2011, 17:20
diagon, для слишком больших степеней работать скорее всего не будет, разве что раскладывать показатель степени на множетели и методично возводить в их степень последнюю цифру... Ну или хитрый математически-акробатический этюд нужен... Больше всего не понятно, как результаты проверять.
Кстати, обратите внимание - я там сначала скобку одну пропустил, потом поправился...
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
10.04.2011, 17:31
Закономерности:
2: 2,4,8,6 - период
3: 3,9,7,1
4: 4,6
7: 7,9,3,1
8: 8,4,2,6
9: 9,1

0,1,5,6 - все время остаются

Осталось только case написать ))
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.04.2011, 17:34  [ТС]
К сожалению, там слишком большие степени.
Через закономерности однако проще будет...
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
10.04.2011, 18:16
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
int get_unsigned(const char*, size_t*);
size_t my_pow(size_t, size_t);
 
int main(int argc, char* argv[])
{
    size_t base, exp, result;
    
    if(argc != 3)
    fprintf(stderr, "Usage: %s BASE EXP\n", *argv), exit(1);
    
    if(!get_unsigned(argv[1], &base))
    fprintf(stderr, "%s is not a legal unsigned integer\n", argv[1]), exit(1);
 
    if(!get_unsigned(argv[2], &exp))
    fprintf(stderr, "%s is not a legal unsigned integer\n", argv[2]), exit(1);
 
    result = my_pow(base, exp);
    
    printf("Last digit of %u ^ %u is %u\n", base, exp, result);
    
    exit(0);
}
 
int get_unsigned(const char* buf, size_t* result)
{
    static char* endptr;
    long int temp;
 
    temp = strtol(buf, &endptr, 10);
 
    if(temp == LONG_MIN || temp == LONG_MAX || !(*buf != '\0' && *endptr == '\0') || temp < 0)
    {
    *result =0;
    return 0;
    }
 
    *result = (size_t) temp;
 
    return 1;
}
 
size_t my_pow(size_t base, size_t exp)
{
    size_t result = 1;
 
    base %= 10;
            
    while(exp--)
    {
    result *= base;
    result %= 10;
    }
 
    return result;
}
Вот вариант с тупым перемножением. Работает, естественно, и для больших степеней
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
10.04.2011, 18:43
Вот немного улучшенный вариант функции my_pow (невооруженным глазом заметно, что на больших степенях работает быстрее). Заметь, что теперь функция принимает уже последнюю цифру от числа-основания степени, а не само основание (см. строку 21):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
int get_unsigned(const char*, size_t*);
size_t my_pow(size_t, size_t);
 
int main(int argc, char* argv[])
{
    size_t base, exp, result;
    
    if(argc != 3)
    fprintf(stderr, "Usage: %s BASE EXP\n", *argv), exit(1);
    
    if(!get_unsigned(argv[1], &base))
    fprintf(stderr, "%s is not a legal unsigned integer\n", argv[1]), exit(1);
 
    if(!get_unsigned(argv[2], &exp))
    fprintf(stderr, "%s is not a legal unsigned integer\n", argv[2]), exit(1);
 
    result = my_pow(base % 10, exp);
    
    printf("Last digit of %u ^ %u is %u\n", base, exp, result);
    
    exit(0);
}
 
int get_unsigned(const char* buf, size_t* result)
{
    static char* endptr;
    long int temp;
 
    temp = strtol(buf, &endptr, 10);
 
    if(temp == LONG_MIN || temp == LONG_MAX || !(*buf != '\0' && *endptr == '\0') || temp < 0)
    {
    *result =0;
    return 0;
    }
 
    *result = (size_t) temp;
 
    return 1;
}
 
size_t my_pow(size_t base, size_t exp)
{
    size_t temp;
 
    if(exp == 0)
    return 1;
        
    if(exp & 1)
    return (my_pow(base, exp - 1) * base) % 10;
    
    temp = my_pow(base, exp / 2);
    return (temp * temp) % 10;
}
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
10.04.2011, 18:49
UPD: исправил my_pow в предыдущем сообщении (все из-за невнимательности )
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
10.04.2011, 18:56
Обошлось без case:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
 
int main()
{   string A;
    long B;
    int N;
 
while(1)
{   cout<<"A = ";  //число - оочень большое
    getline(cin,A);
    cout<<"B = "; //степень - поменьше, от 1 и выше
    cin>>B;
    N = A[A.length()-1]-'0';
    B %= 4;
    if(!B) B=4;
    
    N = (int)pow(1.0*N,B)%10;
 
    cout<<"last digit: "<<N<<"\n";
    cin.sync();
}
    return 0;
}
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
10.04.2011, 19:06
IrineK, нулевую степень неправильно обрабатывает:
Code
1
2
3
A = 34
B = 0
last digit: 6
Может, лучше как-то так:
C++
1
2
3
4
5
if(!B)
{
        cout<<"last digit: 1\n";
        continue;
}
?
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
10.04.2011, 19:08
Специально написала в комментах:
от 1 и выше
Для нулевой степени - допишите пару строк.
2
10.04.2011, 19:10

Не по теме:

О, не заметил...

1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.04.2011, 19:11  [ТС]
А нулевой и нету, минимальная-один.
Спасибо всем.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
10.04.2011, 21:34
С учетом нулевой степени )):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
 
int main()
{   string A;
    long B;
    int N;
 
while(1)
{   cout<<"A = ";  //число - оочень большое
    getline(cin,A);
    cout<<"B = "; //степень - поменьше, от 0 и выше
    cin>>B;
    if(!B) 
    {   cout<<"last digit: "<<1<<"\n";
        cin.sync();
        continue;
    }
 
    N = A[A.length()-1]-'0';
    B %= 4;
    if(!B) B=4;
    
    N = (int)pow(1.0*N,B)%10;
 
    cout<<"last digit: "<<N<<"\n";
    cin.sync();
}
    return 0;
}
Добавлено через 2 часа 20 минут
В строке 17 корректней будет:
C++
1
cout<<"last and the only one digit: "<<1<<"\n";
))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2011, 21:34
Помогаю со студенческими работами здесь

Найти в последовательности числа, которые делятся на свою последнюю цифру
Помогите пожалуйста!!!!задача на С++ Дана последовательность.Длина последовательности целых чисел – случайное число от 10 до 30.В выходную...

Найти последнюю цифру целого числа возведенного в заданную целую степень
задание звучит так: Вводится число,затем его возводят в степень.Найти последнюю цифру числа в степени. Понимаю, что это должно выглядеть...

Нахождение факториала: для заданного N найти последнюю отличную от нуля цифру
Факториалом натурального числа N (обозначается как N!) называется произведение всех натуральных чисел от 1 до N. Например, 5! = 1*2*3*4*5 =...

Найти количество целых чисел в интервале от А до В, которые имеют последнюю цифру 3
Помогите пожалуйста, нужно написать программу, которая находит количество чисел в интервале от А до В, которые имеют последнюю цифру 3.

Найти последнюю цифру длинного целого числа возведенного в заданную целую степень
В чем ошибка? Сайт не принимает. Астроному Василию по роду службы часто приходится иметь дело с невероятно большими числами. Очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru