• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите с решением...

  • Автор темы xparen
  • Дата начала
X

xparen

Люди, помогите плз с задачкой на Visual C++ (в консоли).
===========================================================================
Нужно написать программу, вычисляющую наибольшее простое число, являющееся общим делителем двух заданных натуральных
чисел. Программа должна обеспечивать ввод исходных данных, вывод результатов и диагностических сообщений в особых случаях.
===========================================================================
 
D

DarkKnight

Ну вот самый простой вариант решения
C++:
#include <iostream>

using namespace std;

void main (void)
{
unsigned int A,B,Res = 0,Cout = 0; //Определение A,B, Результата, Количество делителей
setlocale(LC_ALL,"Russian"); //Локаль Для консоли под Win32, что бы кириллица нормально отображалась
cout<<"Введите число A: "; //Ввод первого числа
cin>>A;
cout<<endl<<"Введите число B: "; //Ввод второго числа
cin>>B;

for (unsigned int i=1;i<=A && i<=B; i++) //Перебираем все числа от 1 до (минимального из двух заданных чисел)
{
if (A%i + B%i == 0) //Если сумма модулей равна нулю (значит оба модуля числа нулевые)
{
Res = i; //Запишим общий делитель
cout<<"Найден общий делитель :"<<Res<<endl; //Выведим инфу на экран, что мы нашли
Cout++; //Увеличим счетчик делителей 
}

}

cout<<endl<<"Максимальный общий делитель : "<<Res<<endl<<"Промежуточных делителей: "<<(Cout-1)<<endl; //Выведим результат
system("pause"); //Пауза

}
 
X

xparen

а вот еще только хочу спросить как в в код DarkKnight125 вставить проверку на простоту чисел...... думал может сначала для заданных чисел А и В выбрать простые числа, а потом из них найти общие делители..... итог - ни нахождение простых чисел ни часть с нахождением общих делителей не работает((( помогите
 
D

DarkKnight

Ну если особо код не переделывать, то можно обойтись так :
Как я помню простое число вроде делиться только на 1 и на само себя... Вроде :)


C++:
  for (unsigned int i=1;i<=A && i<=B; i++) //Перебираем все числа от 1 до (минимального из двух заданных чисел)
{
if (A%i + B%i == 0) //Если сумма модулей равна нулю (значит оба модуля числа нулевые)
{
//Тут добавим проверку
bool prostoe = true; //Идем от противного предположим что число простое
for (int j=i-1;j>1;j++) // Цикл от [Найденый делитель - 1] до [2]
{
if (i%j == 0) prostoe = false; //Если делиться без остатка на любое число из вл. цикла - то оно не просто
}			
if (prostoe)
{
Res = i; //Запишим общий делитель		 
cout<<"Найден общий делитель :"<<Res<<endl; //Выведим инфу на экран, что мы нашли
Cout++; //Увеличим счетчик делителей
} 
}

}
Прошу прощение за первонач. невнимательность, пропустил это важное условие
 
X

xparen

я вот сейчас сам попробывал с 0 написать. Подскажите где моя ошибка считает через раз.
Код:
int a,b,i,k,r=0;
cout<<"Vvedite A: ";
cin>>a;
cout<<"Vvedite B: ";
cin>>b;
if(a>=b)
b=k;
else
a=k;
for(i=2;i<=sqrt(k);i++){
if(k%i==0 && a%i == 0 && b%i == 0){
r=i;
cout<<"Obsh prost del :"<<r<<endl;
}
else
cout<<"Prostyh del net ";
getch();
}
предпоследней строчкой getch(); я тупо тормознул зацикливание..... если убрать выдает черти что.......




Ваш последний вариант не работает...... тупо выдает 1 при любом случае....

Код:
 for (int j=i-1;j>1;j++)
помойму здесь вы ошиблись...

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#include "math.h"
#pragma hdrstop

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

#pragma argsused
int main(int argc, char* argv[])
{
unsigned int A,B,Res = 0,Cout = 0;

cout<<"Vvedite A: ";
cin>>A;
cout<<endl<<"Vvedite B: ";
cin>>B;

for (unsigned int i=1;i<=A && i<=B; i++)
{
if (A%i + B%i == 0)
{
bool prostoe = true;
for (int j=i;j<sqrt(i);j++)
{
if (i%j == 0) prostoe = false;
}
if (prostoe)
{
Res = i;
cout<<"Obshij del :"<<Res<<endl;
}
}

}


cout<<endl<<"Max obsh del : "<<Res<<endl;
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Вот я исправил, на мой взгляд, вашу ошибку. Сейчас все работает отлично.
 
D

DarkKnight

for (int j=i-1;j>1;j++) // Цикл от [Найденый делитель - 1] до [2]

тут действительно ошибся... на автомате ++ поставил, там j--;
Уменьшается
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!