Консультация № 179959
18.09.2010, 14:16
0.00 руб.
0 3 1
Здравствуйте эксперты. Помогите доделать программу на языке Си под Юникс. Условие задачи: Дано натуральное число n.Найти произведение максимальных и минимальных чисел. Если соответствующие макс и мин числа встречаются более одного раза, то и в умножении должны встречаться столько же раз.
Внизу приведен код программы, но там не указано как произвести умножение макс и мин чисел согласно условию.

Заранее Большое Спасибо

Приложение:
#include<math.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
int n,m,r,i,min,max;

for(;;)
{
printf("Vvedite natur chislo: \n");
scanf("%d",&n);
if(!n)
break;

for(m=9;n;n/=10)
{
if(m>n%10)
m=n%10;
}
printf("min=%d \n",m);

for(r=0;n;n/=10)
{
if(r<n%10)
r=n%10;
}
printf("max=%d \n",r);
}
for(условие для задания цикла не могу сформулировать)
{
if(условие не могу точно сформулировать)

}
return 0;
}

Обсуждение

Неизвестный
18.09.2010, 14:53
общий
Magma:
Здравствуйте, условие задачи некорректно, поэтому не очень понятно что должна делать программа.
Судя по коду имелось ввиду найти минимальные и максимальные цифры в десятичном представлении исходного натурального числа.
Если я прав, то тогда вам нужно найти не только сами цифры, но и их количество в числе. Это можно сделать неявно, считая сразу степени текущей минимальной и максимальной цифры. В результате после выхода из цикла у вас будет два числа: минимальная и максимальная цифры в степенях, соответствующих их количеству в числе. Остаётся только перемножить эти числа и вывести результат.
Неизвестный
18.09.2010, 16:58
общий
Magma:
мне кажется проще будет поменять Ваш код так:
Код:
#include<math.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
int n,m,r,i,min,max, countmax, countmin;
countmin = countmax = 0;

for(;;)
{
printf("Vvedite natur chislo: \n");
scanf("%d",&n);
if(!n)
break;

for(m=9;n;n/=10)
{
if(m>n%10) {
m=n%10;
countmin=1;
} else if (m==n%10)
countmin++;
}
printf("min=%d \n",m);

for(r=0;n;n/=10)
{
if(r<n%10) {
r=n%10;
countmax = 1;
} else if (r == n%10)
countmax++;
}
printf("max=%d \n",r);
}
printf("multiplication = %d\n", (pow(max, countmax) * pow(min, countmin)));
return 0;
}
давно
Академик
320937
2216
18.09.2010, 19:48
общий
это ответ
Здравствуйте, Magma! Проверял в GCC/Code::Blocks 10.05 под WinXP.
Вводим массив для хранения числа вхождения каждой цифры. Наименьшая цифра есть номер самого левого ненулевого элемента массива, аналогично, наибольшая цифра есть номер самого правого ненулевого элемента. Необходимая проверка на min<max (чтобы не перемножить дважды в случае их равенства).
Код:
/* 179959.c */
/* #include<math.h> в данной трактовке не требуется*/
#include<stdio.h>

int main()
{
int n; /* вводимое число */
int m; /* временная переменная для хранения левой части числа n после отсечения очередной правой цифры */
int r; /* результат */
int i; /* счетчик цикла */
int min; /* наименьшая из цифр, встречающихся в числе */
int max; /* наибольшая из цифр, встречающихся в числе */
int digits[10]; /* массив для хранения числа вхождений каждой цифры */

for(;;)
{
/* пока не прочитано число, количество цифр равно нулю */
for (i=0; i<10; ++i)
digits[i]=0;


printf("Vvedite natur chislo: \n");
scanf("%d",&n);
if(!n)
break;

m=n; /* не будем трогать n, введем еще переменную */
while (m>0)
{
++digits[m%10];
m/=10;
}

/* проходя по массиву слева, находим min */
for (i=0; i<10 && digits[i]==0; ++i)
;
min = i;

/* проходя по массиву справа, находим max */
for (i=10-1; i>=0 && digits[i]==0; --i)
;
max = i;

r=1;
for (i=0; i<digits[min]; ++i)
r*=min;
if (max>min)
for (i=0; i<digits[max]; ++i)
r*=max;

printf("max=%d\tmin=%d\tr=%d\n",max, min, r);
}
return 0;
}

Подобный метод используется, например, у Кернигана & Ричи, раздел 1.6. "Массивы".
Форма ответа