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


Автор: Tripl-X 4.1.2005, 17:14
Народ, помогите с решением этих простых задач!

1. Найти наименьшии общий делитель для всех чисел массива:
int main(void)
Код

{
 int A[10]={0}, j, i, g;

  for(i=0; i<10; i++)
   scanf("%i", &A[i]);
   printf("\n\n");
  for(i=0; i<10; i++)
    {
     for(j=2; j<100; j++)
     if((A[i]%j)==0) printf("%i ", j);
    }
 getch();
}


... Не знаю, что делать дальше... печатаются все делители каждого из чисел.

2.
Замнеить все маленькие буквы на большие.
Код

int main(void)
{
int i;
 char A[255]={0};
 for(i=0; i<255; i++);
   scanf("%x", A[i]);
 for(i=0; i<255; i++)
   if((A[i]>='a') && (A[i]<='z'))
    {
      A[i]-=0x21;
      printf("%c", A[i]);
    }
getch();
}

Попытался сделать с помошью шестнадцатеричного кода... не получилось. Может у вас получится smile
Заранее спасибо!

Автор: sergejzr 4.1.2005, 17:55
Функция отдаст НОД
Код

int NOD(int x, int y)
{
   int rest;
   do
   {
     rest = x % y;
     x = y;
     y = rest;
   } while (rest!=0);

   return x;
 }


Твой код следовало бы переписать примерно так:
Код

{
 int A[10]={0}, j, i, g;

for(i=0; i<10; i++)
{
    scanf("%i", &A[i]);
   printf("\n\n");
  for(i=0; i<10; i++)
    {
     for(j=2; j<100; j++)
     if((A[i]%j)==0){printf("%i ", j); break;}//как только первое число нашли, заканчиваем цикл
    }
}
 getch();
}


А во втором, лучше делать:
if((A[i]>='a') && (A[i]<='z'))
A[i]-='a'+'A';

Автор: Tripl-X 4.1.2005, 21:56
sergej.z

В первой проге считае НОД для каждого символа, а нужно для всего массива...
Как это можно сделать?

***

Цитата(sergej @ 4.1.2005, 21:55)
A[i]-='a'+'A'


после этой строки компилятор пишет
Цитата
Conversion may lose significant digits

Что с этим можно сделать?


Автор: neutrino 4.1.2005, 23:34
Цитата(Tripl @ 4.1.2005, 16:14)
Найти наименьшии общий делитель для всех чисел массива


Наименьший общий делитель 1. Может нужен наибольший? Или наименьшее общее кратное? Корректируй вопрос.

Автор: sergejzr 4.1.2005, 23:38
Цитата(Tripl @ 4.1.2005, 20:56)
после этой строки компилятор пишет

Conversion may lose significant digits

Потому, что A[i] у тебя int.

Код

if((A[i]>='a') && (A[i]<='z'))
{
 A[i]-=(int)'a';
 A[i]+=(int)'A';
//Но вообще то A должен по хорошему быть char[10]
}


А с НОДами тогда так:
Код

int nod=NOD(A[0],A[1]);
for(i=2; i<10; i++)
{
nod=NOD(nod,A[i]);
}
printf("%i ", nod);

Добавлено @ 23:40
Цитата(neutrino @ 4.1.2005, 22:34)
Наименьший общий делитель 1. Может нужен наибольший? Или наименьшее общее кратное? Корректируй вопрос.

Это точно smile

Автор: neutrino 4.1.2005, 23:47
С маленькими буквами самый быстрый способ, что я придумал: использовать маску. Если известно, что это точно буква (а не точка или другой символ), то для того, чтобы из большой сделать маленькую, нужно включить шестой бит, а из маленькой большую наоборот выключить этот бит.
Например переменная С содержит букву, тогда делаем из нее маленькую:

Код

char C;

...

C |= 32;


и большую:

Код

C &= 223; // (-32)


В этом процессе "не портятся" уже маленькие/большие буквы.

Автор: Tripl-X 5.1.2005, 18:39
Да, извиняюсь. Конечно же кратное, а не делитель... делитель в другом задании... поссмотрел не туда... smile

Автор: sergejzr 5.1.2005, 18:45
int NOK(int x, int y)
{

return (x*y) / NOD(x,y);
}

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