
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.82] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ну там я комментарий не поправил. Так надо:
![]() ![]() #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { long n=360521; /* число (надо бы вводить?) */ char bufer[12]; /* буфер для числа */ int myMax1=-1,myMax2=-1, i, len, posI=0, posI2=-1; itoa( n, bufer, 10); /* переводим число в строку, 10-ичная система счисления) */ len = strlen( bufer ); for( i=0; i<len; i++) if( (int)(bufer[i]-'0') > myMax1 ) { myMax1 = (int)(bufer[i]-'0'), posI = i; } for( i=0; i<len; i++) if( (int)(bufer[i]-'0') > myMax2 && (int)(bufer[i]-'0')!=myMax1 ) { myMax2 = (int)(bufer[i]-'0'), posI2 = i; } printf("\npos=%d", posI); /* пишем положение старшей цифры */ printf("\npos2=%d", posI2); /* пишем положение почти старшей цифры */ return(0); } |
Сообщ.
#17
,
|
|
|
Цитата Славян @ пишем положение почти старшей цифры спасибо большое. даже не знаю что бы без тебя делал))))))))))))) |
Сообщ.
#18
,
|
|
|
Не за что. Как бы сие прискорбно ни звучало, я всё же надеюсь, что препод будет умнее и влепит вам двояк или около того за незнание мат.части.
![]() Но думаю, что если вы повгрызаетесь в тему, то тоже будете опытнее. Не забивайте, изучайте!! ![]() |
Сообщ.
#19
,
|
|
|
Вот вам ещё пара примеров, от которых препод будет в восторге:
Со строковым буфером, как у Славяна: ![]() ![]() #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> typedef struct max { char max1; char max2; char pos1; char pos2; } Max; int main() { long n = 360521; /* число (надо бы вводить?) */ char i; int len = floor(log10(abs(n)))+1; /* вычисляем число цифр */ char* bufer = (char*)malloc(len*sizeof(char)); /* буфер для числа */ Max* max = (Max*)malloc(sizeof(Max)); /* буфер для результата */ memset(max,0,sizeof(Max)); snprintf(bufer,len,"%d",n); /* переводим число в строку, 10-ичная система счисления) */ for(i=0;i<len;i++){ if((char)(*(bufer+i)-'0') > max->max1) { max->max1 = (char)(*(bufer+i)-'0'); max->pos1 = i; } } for(i=len-1;i>=0;i--){ if((char)(*(bufer+i)-'0') > max->max2 && (char)(*(bufer+i)-'0')!=max->max1) { max->max2 = (char)(*(bufer+i)-'0'); max->pos2 = i; } } printf("\npos1=%d", max->pos1); /* пишем положение старшей цифры */ printf("\npos2=%d", max->pos2); /* пишем положение почти старшей цифры */ printf("\nmax1=%d", max->max1); /* пишем максимальную цифру */ printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */ free(bufer); free(max); return(0); } Без строк, чистая математика: ![]() ![]() #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> typedef struct max { char max1; char max2; char pos1; char pos2; } Max; char get_digit(long n, int i) { long pos; pos = n % (long)pow(10, i+1); if (i > 0) { pos /= (long)pow(10, i); } return (char)pos; } int main() { long n = 360521; /* число (надо бы вводить?) */ char i; int len = (int)floor(log10(abs(n)))+1; /* вычисляем число цифр */ Max* max = (Max*)malloc(sizeof(Max)); /* буфер для результата */ memset(max,0,sizeof(Max)); for(i=0;i<len;i++){ if(get_digit(n,i)>max->max1 ) { max->pos1 = i; max->max1 = get_digit(n,max->pos1); } } for(i=len-1;i>=0;i--){ if(get_digit(n,i)>max->max2 && get_digit(n,i)!=max->max1) { max->pos2 = i; max->max2 = get_digit(n,max->pos2); } } printf("\npos1=%d", max->pos1); /* пишем положение старшей цифры */ printf("\npos2=%d", max->pos2); /* пишем положение почти старшей цифры */ printf("\nmax1=%d", max->max1); /* пишем максимальную цифру */ printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */ free(max); return(0); } Лень всё перепроверять, но, должно всё работать. Шестёрка в журнале вам обеспечена... |
Сообщ.
#20
,
|
|
|
Надо бы в get_digit поправить первый аргумент с int на long, а то в 16-битных ОС/компиляторах будет ошибка перевода 32-битного в 16 бит.
![]() |
Сообщ.
#21
,
|
|
|
Спасибо, поправил
![]() Добавлено Да, и цикла надо будет, скорее всего, два. Я же не два числа ищу, а одно, двумя способами... |
Сообщ.
#22
,
|
|
|
Прошу не считать за придирки, а просто как шлифовка к идеалу:
1. В BorlandC++ 3.1 вроде ошибку писали, что число большое без обозначения присваиваем. Т.е. надо 360521L. 2. malloc вертухает void *, поэтому тоже где-то ругань была и надо бы приводить: *max = (Max*)malloc(...); А вообще лучше просто один раз массив завести: Max max; и не мучаться с памятью(malloc/free). 3. Сравнение в if идёт int c char. Надо всё в int перевести или поля max2/max1 сделать int'овскими. 4. результат floor лучше привести прямо в int: len = (int)floor(... . 5. Незачем инициализировать i в отдельной строке. Она ж в цикле тоже обнулится. Где-то можно бы и убрать. 6. max2 нигде не инициализируется. Ну станет она вдруг 127, и не изменится (if не пройдёт!), и на выдаче будет хлам. ![]() |
Сообщ.
#23
,
|
|
|
Исправил все замечания. Замечу, приведения типов 2 и 4 пункта в чистом Си не обязательно. Про int - в данной задаче я на 147% уверен что не будет чисел со 127+ цифрами, пойдёт и char. И вес цифры меняется от 0 до 9, тоже, сойдёт и char.
Про кучу - тут она необходима, чтобы ТС обьяснил преподу что такое *(ptr+offset), и некоторые фишки, которые связаны с memset/malloc/free Мы же стремимся мотивировать ТС на новые знания ![]() |
Сообщ.
#24
,
|
|
|
Вот у меня в BC3.1 ошибку пишет, что нельзя char i после вызова функции. Надо бы выше поднять, где все переменные заводятся.
![]() |
Сообщ.
#25
,
|
|
|
Цитата Славян @ BC3.1 ошибку пишет, что нельзя char i после вызова функции ![]() Никогда с таким не встречался, спасибо за подсказку) |
Сообщ.
#26
,
|
|
|
На числе 836075291 прога соврала: 8 не нашла.
![]() |
Сообщ.
#27
,
|
|
|
Быть может, это связанно с особенностями компилятора... Борланд для меня - тёмный лес, ориентируюсь всегда по mingw
https://onlinegdb.com/SyQRfwgTz |
Сообщ.
#28
,
|
|
|
Потому что labs надо, а не abs, кой сказал, что длина = 5 цифр.
![]() Добавлено Тьфу, имелось ввиду, что abs обработал число как int16 и len сказала, что длина 5 цифр. |
Сообщ.
#29
,
|
|
|
Цитата Славян @ labs надо, а не abs хм, с вами узнал две новые вещи. Надо отвыкать от x32 ![]() |
Сообщ.
#30
,
|
|
|
Совсем уж нано-, когда число малое=4(например). Надо не писать max2=0, а как-то так что ли:
![]() ![]() max->max2=-1; ... if( max->max2>=0 ) printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */ else printf("\nmax2 отсутствует"); Добавлено Ну и да, при n=0 пишет в консоль: "log10: SING error", но и продолжает работать. ![]() |