Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 6
1

Петя криптограф

06.06.2015, 17:03. Просмотров 564. Ответов 7
Метки нет (Все метки)


Здравствуйте, как обычно у студентов началась зачетная неделя, и вот преподаватель озадачил задачей:
Как-то раз известный криптоаналитик Петя разрабатывал очередной шифр. Ему понадобилась псевдослучайная последовательность цифр определённой длины, которую можно было бы легко восстановить по ключевым данным. В качестве такой последовательности Петя выбрал последовательность цифр, стоящих в конце факториала числа N. Факториалом положительного целого числа N называется произведение всех целых чисел от 1 до N. Так как факториалы больших чисел оканчиваются множеством нулей, что не удовлетворяет требованиям криптостойкости, Петя решил эти нули не учитывать.
Требуется написать программу, которая поможет Пете по заданному числу N и длине последовательности K получить необходимую последовательность цифр. При этом если количество значащих цифр (без учёта конечных нулей) в факториале меньше K, то итоговая последовательность должна иметь длину меньше K.
В единственной строке входного файла записаны через пробел целые числа N (1 ≤ N ≤ 1 000 000) и K (1 ≤ K ≤ 100).
Выведите в выходной файл искомую последовательность цифр.
03.06.15
Пример ввода 1
3 1
Пример вывода 1
6
Пример ввода 2
10 2
Пример вывода 2
88
Пример ввода 3
10 50
Пример вывода 3
36288

Так вот я попыталась ее решить, но у меня все равно что то не получается, и не могу догадаться как дописать:
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
#include <iostream>
#include <math.h>
using namespace std;
long int factorial(int n)
{
if (n<=1)
return (n);
else return(n*factorial(n-1));
}
 
int main ()
{
int i,k,j; long int f,a;
cin>>i;
cin>>k;
f=factorial(i);
cout<<f;
if(f%10==0)
for(a=10; ;a*=10){
f/=a;
if(f%10!=0)break;
}
cout<<' '<<a<<endl;
}
Прошу, помогите дописать! Очень нужен этот зачет((((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2015, 17:03
Ответы с готовыми решениями:

Изобретательный петя
Петя нашел на чердаке старый телеграфный аппарат и приделал к нему хитроумное устройство, которое...

Петя решает задачи
Здравствуйте! Помогите, пожалуйста, решить задачу: На первую задачу Пете уйдет 1 минута, на...

Петя загадал 7 целых чисел: от -4 до 4 каждое
Петя загадал 7 целых чисел: от -4 до 4 каждое. Хитрый Коля предложил Пете составить сумму по...

Олимпиадная задача. Юный программист Петя обучает своего младшего брата арифметике
Карточки для счета Юный программист Петя обучает своего младшего брата арифметике. Петя...

7
Просто Лис
Эксперт Python
4246 / 2656 / 911
Регистрация: 17.05.2012
Сообщений: 7,916
Записей в блоге: 9
06.06.2015, 17:59 2
C++
1
2
3
4
5
f=factorial(i);
cout<<"f ="<<f<<"\n";
while (f%10==0) f\=10;//отбрасываем нули в конце
cout<<"f ="<<f<<"\n";
cout<<f%pow(10,k);
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 6
06.06.2015, 18:19  [ТС] 3
почему то выдает ошибку что long int не подходит под операнд %
0
Просто Лис
Эксперт Python
4246 / 2656 / 911
Регистрация: 17.05.2012
Сообщений: 7,916
Записей в блоге: 9
06.06.2015, 18:27 4
В какой строчке?
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 6
06.06.2015, 18:31  [ТС] 5
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
while (f%10==0) f\=10;//отбрасываем нули в конце
в этой(
0
Просто Лис
Эксперт Python
4246 / 2656 / 911
Регистрация: 17.05.2012
Сообщений: 7,916
Записей в блоге: 9
06.06.2015, 18:37 6
слеш не в ту сторону стоит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    #include <iostream>
    #include <math.h>
    using namespace std;
    long int factorial(int n)
    {
    if (n<=1)
    return (n);
    else return(n*factorial(n-1));
    }
     
    int main ()
    {
    int i,k,j; long int f,a;
    i=10;
    k=2;
    f=factorial(i);
    cout<<"f ="<<f<<"\n";
    while (f%10==0) f/=10;//отбрасываем нули в конце
    cout<<"f ="<<f<<"\n";
    cout<<f%((int)pow(10,k));
    }
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 6
06.06.2015, 19:06  [ТС] 7
спасибо все работает, но пишет превышение лимита времени, как можно уменьшить не знаете?!)
0
Просто Лис
Эксперт Python
4246 / 2656 / 911
Регистрация: 17.05.2012
Сообщений: 7,916
Записей в блоге: 9
06.06.2015, 19:43 8
попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main (){
  int n,k;
  //cin>>n;
  //cin>>k;
  n=10;
  k=2;
  long int f = 2;
  for (int i=3;i<=n;i++) f*=i;  
  while (f%10==0) f/=10;//отбрасываем нули в конце
  n=10;  
  for (int i=1;i<k;i++) n*=10;
  cout << f%n;
}
Добавлено через 14 минут
Быстрое вычисление факториала:
Нахождение факториала: для заданного N найти последнюю отличную от нуля цифру
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2015, 19:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

За сколько месяцев Петя накопит на компьютер, откладывая заданную часть денег, получаемых на карманные расходы?
Каждую неделю Петя получает сумму в размере S рублей на личные расходы, из них он тратит X% на...

В тексте заменить слово «Петя» на слово «Игорь»
Если в строке содержится слово «Петя», заменить его на слово «Игорь». Не используя replace и string.

Вася и Петя ограбили банк: вычислить, сколько монет украл Петя
Вася и Петя ограбили банк. Каждый из них смог вынести по одному мешку с золотом. Вскоре грабителей...

Криптограф
Помогите с созданием криптографа. Пробовал использовать метод replace(), но либо выдает слишком...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.