Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] задачка


Автор: Evghenusi 18.12.2008, 22:08
добрый вечер!
не могли бы вы мне помочь с задачкой, а то не знаю как её решить:

Введите целое   m,   10 < m < 1000.   Найдите последнюю цифру суммы   1(1) + 2(2) + 3(3) + … + m(m).
в скобочках степень

Автор: MastEdm 18.12.2008, 22:35
Почитай про модульную арифметику

Автор: Evghenusi 19.12.2008, 00:43
спасибо за ответ, только знать бы как ним воспользоваться

Автор: Dmi3ev 19.12.2008, 05:25
я бы не согласился, я бы сказал, что скорее надо вспомнить умножение в столбик)))) и заметить некоторые закономерности)))
ну а прога, которая решает данную проблему выглядит примерно так:
Код

//---------------------------------------------------------------------------

#include <iostream.h>

//---------------------------------------------------------------------------
int myf(int b)
{
int myfres=1;
for (int i=1; i<=b; i++)
 {
  myfres=(myfres*b)%10;
 }
return myfres;
}

int main()
{
int m;
cout<<"Enter m:";
cin>>m;
cout<<endl;
int res=0;
for (int i=1; i<=m; i++)
{
 res+=myf(i);
}
cout<<"Answer: "<<res%10;
return 0;
}
//---------------------------------------------------------------------------

Вроде все верно, я проверял, у меня получалось))) логика такова, что нам важны только единицы числа, именно за ними мы и ведем наблюдение, а остальное все по барабану)))
короче, должна работать)))

Добавлено @ 05:30
Цитата


Введите целое   m,   10 < m < 1000.

можно тогда еще условие прилепить после ввода m))) тогда вот так:
Код

//---------------------------------------------------------------------------
#include <iostream.h>
//---------------------------------------------------------------------------
int myf(int b)
{
int myfres=1;
for (int i=1; i<=b; i++)
 {
  myfres=(myfres*b)%10;
 }
cout<<myfres<<endl;
return myfres;
}

int main()
{
int m;
cout<<"Enter m:";
cin>>m;
if ((m<10) || (m>=1000))
 {
  cout<<"m out of (10, 1000)!";
  return 0;
 }
cout<<endl;
int res=0;
for (int i=1; i<=m; i++)
{
 res+=myf(i);
}
cout<<"Answer: "<<res%10;
return 0;
}
//---------------------------------------------------------------------------

так как-то...

Добавлено @ 05:32
и добавить вывод последней цифры на каждой итерации)))

Добавлено @ 05:32
вообщем вот тебе альфа-версия и бетта-вресия  smile  smile  smile дальше сам  smile

Добавлено @ 05:37
можно еще в цикле в функции добавить
Код

//...
for (int i=1; i<=b; i++)
 {
  myfres=(myfres*b)%10;
  if (myfres==0) 
   break;
 }
//...

наверное так можно, потому что 100(100) будет давать 0 на конце всегда, так лучше сразу закончить эту мутотень, чем через 99 раз...
я думаю, что это даже правильно будет... хотя не проверял и не замудрялся над этим... так что это только догадка...

Автор: J0ker 19.12.2008, 06:36
хах
забавно
никогда не видел этой задачи прежде  smile 
даю маячек:

0
1
2, 4, 8, 6
3, 9, 7, 1
4, 6
5
6
7, 9, 3, 1
8, 4, 2, 6
9, 1

Автор: J0ker 19.12.2008, 07:27
неудержался, запрогал
сорри если кому сломал кайф  smile 
Код

#include <iostream>
using namespace std;

int arr0[] = {0};
int arr1[] = {1};
int arr2[] = {2,4,8,6};
int arr3[] = {3,9,7,1};
int arr4[] = {4,6};
int arr5[] = {5};
int arr6[] = {6};
int arr7[] = {7,9,3,1};
int arr8[] = {8,4,2,6};
int arr9[] = {9,1};

int *arrp[] = { arr0, arr1, arr2, arr3, arr4, arr5, arr6, arr7, arr8, arr9 };

#define ARR_SIZE(n) (sizeof(arr##n)/sizeof(arr##n[0]))

int sz[] = {
    ARR_SIZE(0),
    ARR_SIZE(1),
    ARR_SIZE(2),
    ARR_SIZE(3),
    ARR_SIZE(4),
    ARR_SIZE(5),
    ARR_SIZE(6),
    ARR_SIZE(7),
    ARR_SIZE(8),
    ARR_SIZE(9)
};



int main()
{
    int s;
    cin >> s;

    int sum = 0;
    for(int i = 1; i <= s; ++i)
        sum += arrp[i%10][(i-1) % sz[i%10]];

    cout << sum << endl;

    return 0;
}


ЗЫЖ тут сумма последних цифр выводится - в задаче нужно последнюю цифру суммы - тогда
cout << sum%10 << endl;
или на этапе подсчета
sum += arrp[i%10][(i-1) % sz[i%10]];
sum %= 10;

Автор: Dmi3ev 19.12.2008, 07:48
J0ker,
Цитата

Найдите последнюю цифру суммы   1(1) + 2(2) + 3(3) + … + m(m).

Цитата

int arr9[] = {9,1};

применительно к данной задаче
если 9^9=...9, если 9*.9=...9, короче только девять на конце...
int arr9[] = 9;
для этой задачи... для 2: 4 и 6...

Автор: J0ker 19.12.2008, 07:56
Dmi3ev, не, ну понятно, что x9-1 - всегда четно, а остаток четного деленного на 2 всегда 0, и 0 деленное на любое число все равно ноль
но это просто наблюдение
надо-же, что-бы было КРАСИВО  smile 

Автор: Dmi3ev 19.12.2008, 08:00
Цитата

надо-же, что-бы было КРАСИВО

)))
Ну тогда не спорю...

Добавлено через 6 минут и 21 секунду
А еще ты заметил такую закономерность:
1: 1,4,7,6,5,6,3,6,9,0

2: 1,6,3,6,5,6,7,4,9,0

3: 1,4,7,6,5,6,3,6,9,0

я про че ваще, 1, 9, 0 остаются на своих местах а остальные зеркально отражаются (ну короче ты понял)... так что таким макаром можно ваще прогу укоротить, проверяя делится ли десяток на 2, если да, то певая хня, если нет , то вторая, причем ЧТОБЫ КРАСИВО БЫЛО С ЗЕРКАЛЬНОСТЬ ЧТО-НИБУДЬ ПОДУМАТЬ  smile 
ИЛИ Я ТУПЛЮ??? КАК ДУМАЕШЬ???

Добавлено через 10 минут и 37 секунд
Цитата

я про че ваще, 1, 9, 0 остаются на своих местах

и не только они, ну ты понял, просто задолбаешь опять определениями))) и придирками)))

Добавлено через 11 минут и 1 секунду
как тогда, с точками)))

Автор: Evghenusi 19.12.2008, 08:20
огромное спасибо, не сочтите за наглость, а нельзя ли код(listing) на "С" без плюсов  smile 

Автор: Dmi3ev 19.12.2008, 08:23
а в первом коде, чем тебе не с (сout, cin)? а во втором... тоже самое...? это наглость...)))

Автор: Evghenusi 19.12.2008, 08:34
да просто я только учу язык "Си", и мне пока не известны: cout, endl, cin
да и библиотека мне не известна #include <iostream>

Автор: Dmi3ev 19.12.2008, 09:08
переделал свое, хоя у J0ker-а вариант более хороший, я хотел тебе написать про эту логику, но... короче вот так:
Код

//---------------------------------------------------------------------------

#include <iostream.h>

//---------------------------------------------------------------------------
int myf(int b)
{
int myfres=1;
for (int i=1; i<=b; i++)
 {
  myfres=(myfres*b)%10;
 }
return myfres;
}

int main()
{
int m;
printf("Enter m:");
scanf("%u", &m);
if (m<10 || m>=1000)
 {
  printf("m out of range!"); return 0;
 }
printf("\n");
int res=0;
for (int i=1; i<=m; i++)
{
 res+=myf(i);
}
printf("Answer: %u",res%10);
return 0;
}
//---------------------------------------------------------------------------

можно так, как-то
я тут делал, так что ...

Автор: Evghenusi 19.12.2008, 13:55
благодарю

Автор: Earnest 19.12.2008, 17:20
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Rodman 19.12.2008, 17:28

M
Rodman
Модератор: Название темы должно отражать ее суть!

Автор: J0ker 19.12.2008, 18:33
Dmi3ev, я думаю что куда-уж короче - все в статических массивах, сложность вычисления линейная, решение универсальное - никаких условий
вообще таблица подходит для определения последней цифры любого числа >=0 в любой степени >=0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)