Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 15:14   #1
ras2kas
 
Регистрация: 31.03.2013
Сообщений: 8
Радость Задача по автоморфным числам (запись которых совпадает с последними цифрами записи их квадрата)

Искал, искал задачи про автоморфные числа, почему то рабочих не нашел... В общем помогите мне пожалуйста решить вот такую задачу: Пользователь вводит натуральное число n (n>=5). Среди чисел 1,...,n программа находит все такие, запись которых совпадает с последними цифрами записи их квадрата (например, 6^2=36, 25^2=625)

Я еще только только начал изучать С++ смог осилить только вот это, то есть вывожу все числа до n их квадраты, но вот как теперь выразить последнюю цифру квадрата (ну у небольших чисел, квадрат которых меньше 81 можно, последнюю цифру можно выразить при помощи деления на 10 с остатком а с остальными как?) и сравнить ее с самим числом?
Это все что я смог сам сделать:
Код:
#include <iostream>
#include <conio.h>
using namespace std;
 
int main() {
setlocale (LC_ALL, "Russian");
int n(0);
int i(0);
int k(0);
double c(0);
cout <<"Введите натуральное число n: ";
cin >> n;
if ( n>=5 ) {
while (i < n+1) {
        cout << "Натуральное число:" << i <<"  ";
        k = i*i;
        c= k%10;
    cout << "квадрат = " << k << endl;
        i++;
    }
}
else cout <<"Error";
_getch();
return 0;
}

Помогите пожалуйста, сдавать нужно скоро преподавателю

Последний раз редактировалось Stilet; 31.03.2013 в 16:05.
ras2kas вне форума Ответить с цитированием
Старый 31.03.2013, 15:57   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <iostream>
#include <conio.h>
using namespace std;

int
len(long long unsigned i) {
    int k = 1;
    while (i) {
        k *= 10;
        i /= 10;
    }
    return k;
}

int main()
{
    setlocale (LC_ALL, "Russian");
    long long unsigned n;
    cout <<"Введите натуральное число n: ";
    cin >> n;
    if (n < 5) {
        cout << "n должно быть больше или равно 5 :(";
        return 0;
    }
    for (long long unsigned i = 1; i <= n; ++i) {
        if (i * i % len(i) == i) {
            cout << i << endl;
        }
    }
    _getch();
    return 0;
}
Решение в лоб.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 31.03.2013, 16:38   #3
ras2kas
 
Регистрация: 31.03.2013
Сообщений: 8
По умолчанию

Во круто спасибо! А вы не могли бы объяснить те строчки которые вы добавили?
ras2kas вне форума Ответить с цитированием
Старый 31.03.2013, 17:00   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Пожалуйста.
Функция len возвращает число с таким количеством нулей, каково количество разрядов переданного числа i (берем число и делим на 10, пока оно не выродится в 0, при этом временную переменную домножаем на 10).
Ну и все. Получаем остаток от деления квадрата i на число с требуемым количеством нулей (то есть выделяем последние цифры) и сравниваем с самим числом i.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 31.03.2013, 17:31   #5
ras2kas
 
Регистрация: 31.03.2013
Сообщений: 8
По умолчанию

Я что то не очень понимаю, объясните мне пожалуйста все построчно, что каждая строка делает...
ras2kas вне форума Ответить с цитированием
Старый 31.03.2013, 17:56   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Какие именно строчки вызывают затруднения?
Единственное отличие от Вашей программы - функция len.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 31.03.2013, 18:16   #7
ras2kas
 
Регистрация: 31.03.2013
Сообщений: 8
По умолчанию

int
len(long long unsigned i) {
int k = 1;
while (i) {
k *= 10;
i /= 10;
}
return k;
}


и


for (long long unsigned i = 1; i <= n; ++i) {
if (i * i % len(i) == i) {
cout << i << endl;
}
ras2kas вне форума Ответить с цитированием
Старый 31.03.2013, 18:39   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
int
len(long long unsigned i) {
    int k = 1;
    while (i) {
        k *= 10;
        i /= 10;
    }
    return k;
}
Функция len, получающая параметром число типа long long unsigned и возвращающая int.
Цикл, пока i не равно 0. Умножаем k на 10 и делим i на 10.
Возвращаем k.

Проделайте на бумажке, чтобы понять, что функция вернет число вида 10...0, где количество нулей соответствует длине числа i.
Код:
for (long long unsigned i = 1; i <= n; ++i) {
    if (i * i % len(i) == i) {
        cout << i << endl;
    }
}
Цикл по i от 1 до n. В if проверяется, что остаток от деления квадрата числа на len равен самому числу. Если выполняется, то число выводится на экран.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 31.03.2013, 18:55   #9
ras2kas
 
Регистрация: 31.03.2013
Сообщений: 8
По умолчанию

Цитата:
Функция len, получающая параметром число типа long long unsigned и возвращающая int.
Цикл, пока i не равно 0. Умножаем k на 10 и делим i на 10.
Возвращаем k.

Проделайте на бумажке, чтобы понять, что функция вернет число вида 10...0, где количество нулей соответствует длине числа i.
я бездарен.. никак не пойму как это все работает...
ras2kas вне форума Ответить с цитированием
Старый 31.03.2013, 19:05   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Пусть, рассматриваемое число 666
k = 1
Шаги цикла:
1) пока 666 не равно 0
k = 10 i = 66
2) пока 66 не равно 0
k = 100 i = 6
3) пока 6 не равно 0
k = 1000 i = 0
4) пока 0 не равно 0 -> выход из цикла

k = 1000
Количество нулей - три.

Цикл while исполняется, пока условие отлично от нуля.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на тип запись: из ассортимента конфет выбрать те, стоимость которых от 30 до 55 рублей за 1 кг lililili Паскаль, Turbo Pascal, PascalABC.NET 2 29.11.2012 15:01
Найти первые 4 четыре натуральных числа, пятая степень которых оканчивается тремя одинаковыми цифрами, кроме нулей KolinKr Паскаль, Turbo Pascal, PascalABC.NET 3 26.01.2012 15:37
запись любого целого числа n (n<3999) арабскими цифрами перевести в запись римскими цифрами (на языке C) qazse Помощь студентам 1 24.11.2011 12:05
Выбрать числа, у которых совпадает первая и последняя цифра (в Lazarus) Сristina Помощь студентам 0 29.03.2011 19:37