
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.87] |
![]() |
|
Сообщ.
#1
,
|
|
|
я просто проболел и все лекции с обьяснениями пропустил. а программы надо как то сдавать. можете помочь?
1)Дано натуральное число, в котором все цифры различны. Определить: а) порядковые номера двух его максимальных цифр, считая номера: от конца числа; от начала числа; 2)Среди чисел 1,1+1/2,1+1/2+1/3, ... найти первое, большее числа n. ![]() |
Сообщ.
#2
,
|
|
|
Для второго: можно в лоб, а можно, используя: Сумма = ln(k) + 0,577215665... Вам как?
|
Сообщ.
#3
,
|
|
|
Цитата Славян @ я не то скопировал. просто. я сам его сделал ещё давно. но все равно спасибо |
Сообщ.
#4
,
|
|
|
Первое осталось? Оно то хоть то?
![]() |
Сообщ.
#5
,
|
|
|
[quote=Славян,1524767668,3767979][/q
да первое то) это все в код блок надо сделать но он у меня везде просто ошибки выдает Добавлено [quote=Славян,1524760642,3767971][/quote] Дано натуральное число n. Вычислить: а) 1/sin1+1/sin1+sin2+...+1/sin1+...+ sin n вот такое задание |
Сообщ.
#6
,
|
|
|
Что-то со вторым я опять последовательность не распознал. Так:
(sin1 + 1/sin1) + (sin2 + 1/sin1) + (sin3 + 1/sin1) + ... или иное? Добавлено Хм-м... Или там k раз идёт 1/sin1 ? Так: (1/sin1 + 1/sin1 + sin2) + (1/sin1 + 1/sin1 + 1/sin1 + sin3) + ... + (1/sin1 + ...(N раз)... + 1/sin1 + sinN) ? |
Сообщ.
#7
,
|
|
|
Цитата Славян @ 1/sin1+1/sin1+sin2+...+1/sin1+...+ sin n ну она вот такая 1/(sin(1)) + 1/(sin(1)+sin(2)) + ... + 1/(sin1(+)...+ sin(n)) там сборник заданий по програмированию златопольский. 5.93а если так легче будет |
Сообщ.
#8
,
|
|
|
Первое можно через строки провернуть. Схема такая:
![]() ![]() #include <stdio.h> int main() { long n=360521; /* число (надо бы вводить?) */ char bufer[12]; /* буфер для числа */ int myMax1=-1, i, len, posI; itoa( n, bufer, 10); /* переводим число в строку, 10-ичная система счисления) */ len = strlen( bufer ); for( i=0; i<len; i++) if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i; printf("pos=%d", posI); /* пишем положение старшей цифры */ return(0); } |
Сообщ.
#9
,
|
|
|
Цитата Славян @ if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i; ну да. принцип я понял. но вот эта строка что в ней? потому чо тут выдает ошибку if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i; |
Сообщ.
#10
,
|
|
|
Цитата alex____666 @ А-а! Понятно! Кстати, неизвестно же, что ни на каком шаге знаменатель в ноль не обернётся!? Это так, к слову.ну она вот такая 1/(sin(1)) + 1/(sin(1)+sin(2)) + ... + 1/(sin1(+)...+ sin(n)) Можно так(кусок): ![]() ![]() #include <math.h> int main() { int i, n=6; /* какова длина цепи */ double sum=0, sinS=0; /* sinS = сумма синусов */ for( i=1; i<=n; i++) sinS += sin(i), sum += 1/sinS; return printf("%f", sum); } Добавлено Цитата alex____666 @ А напишите, что за ошибка? Мож так сканает:вот эта строка что в ней? потому чо тут выдает ошибку if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i; ![]() ![]() if( (int)(bufer[i]-'0') > myMax ) { myMax = (int)(bufer[i]-'0'), posI = i; } Добавлено В той строке берётся символ, вычитается код символа ноль (получая настоящее машинное число), сравнивается с числом в памяти, записывается (при удаче) в переменную=память и положение (порядковый номер) большего символа тоже записывается. |
Сообщ.
#11
,
|
|
|
Цитата Славян @ Process terminated with status 1 (0 minute(s), 0 second(s)) 1 error(s), 5 warning(s) (0 minute(s), 0 second(s)) вот ошибка соре не то скопировал опять саму ошибку он не дает скопировать |
Сообщ.
#12
,
|
|
|
Хм-м... возможно он беспокоится, что захода в if не будет и posI останется непроинициализированной. Тогда надо изменить там так:
![]() ![]() int myMax1=-1, i, len, posI=0; Добавлено Ну а вообще, надо ж stdlib! ![]() ![]() #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { long n=360521; /* число (надо бы вводить?) */ char bufer[12]; /* буфер для числа */ int myMax1=-1, i, len, posI=0; itoa( n, bufer, 10); /* переводим число в строку, 10-ичная система счисления) */ len = strlen( bufer ); for( i=0; i<len; i++) if( (int)(bufer[i]-'0') > myMax ) { myMax = (int)(bufer[i]-'0'), posI = i; } printf("pos=%d", posI); /* пишем положение старшей цифры */ return(0); } |
Сообщ.
#13
,
|
|
|
Цитата Славян @ да именно так. он бееспокоится что myMax является не обьявленной и пишет "сначала используйте эту функцию" |
Сообщ.
#14
,
|
|
|
А! Косяк мой, единицу забыл!
![]() ![]() #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=0; 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("pos=%d", posI); /* пишем положение старшей цифры */ printf("pos2=%d", posI2); /* пишем положение старшей цифры */ return(0); } |
Сообщ.
#15
,
|
|
|
Цитата Славян @ так, а зачем мы в конце 2 раза обявляем положение старшей цифры7 Добавлено Цитата Славян @ так, а зачем мы в конце 2 раза обьявяем положение старшей цифры? |
Сообщ.
#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", но и продолжает работать. ![]() |
Сообщ.
#31
,
|
|
|
Цитата VisualProg @ Вот вам ещё пара примеров, от которых препод будет в восторге: Со строковым буфером, как у Славяна: ![]() ![]() #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); } Лень всё перепроверять, но, должно всё работать. Шестёрка в журнале вам обеспечена... спасибо большое. мне просто принцип работы понять нужно было)) |