Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Факториел задача за C

Featured Replies

Здравейте направили сме в клас програма, която изчислява факториел на числата до 12. За домашно господина ни е дал да я поправим, така че да може да изчислява и 13 14 15 (само тези трите). Ще ви помоля да напишете кратко обяснение, защо точно така го променяте, защото най-вероятно ще иска да му обясним.Програмата трябва да е на C. Мерси предварително.

#include <stdio.h>
int main ()
{
    int fact(int);
    int f,rez;
    printf("Vavedete 4islo s koeto 6te pravim vaktuler");
    scanf("%d",&f);
    rez=fact(f);
    printf("Faktoriel na 4isloto %d e %d",f,rez);
    return(0);
}
int fact (int num){
int factoriel=1;
for (int i=1;i<=num;i++)
factoriel=factoriel*i;
return (factoriel);
}

dimbadboy бъркаш така написана програмата не би могла да изчисли 12! максимум до 8! 12! e 479001600 което няма как да е във формат int.

Редактирано от ined (преглед на промените)

dimbadboy бъркаш така написана програмата не би могла да изчисли 12! максимум до 8! 12! e 479001600 което няма как да е във формат int.

И до 8 не може, защото променливите са дефинирани със знак +-32к

П.П. И да си коригирам предишния пост: за 13 факториал=6227020800 е нужно 64-битово число, т.е. нещо от рода на double long, long long (май беше така) ако го има на платформата може и да стане

Редактирано от capnemo (преглед на промените)

  • Автор

Хммм double long свърши до някъде работа след като замених на реда с for: int с double long ги докарах до 12 след това ми ги дава с минус :tease: Някакви идеи ?

#include <stdio.h>
int main ()
{
    int fact(int);
    int f,rez;
    printf("Vavedete 4islo s koeto 6te pravim vaktuler");
    scanf("%d",&f);
    rez=fact(f);
    printf("Faktoriel na 4isloto %d e %d",f,rez);
    return(0);
}
int fact (int num){
int factoriel=1;
for (double long i=1;i<=num;i++)
factoriel=factoriel*i;
return (factoriel);
}

ПП: Според мен тук "int f,rez;" или rez=fact(f); нещо трябва да се корегира, но не знам какво.

Редактирано от dimbadboy (преглед на промените)

Хммм double long свърши до някъде работа след като замених на реда с for: int с double long ги докарах до 12 след това ми ги дава с минус :tease: Някакви идеи ?

#include <stdio.h>
int main ()
{
    int fact(int);
    int f,rez;
    printf("Vavedete 4islo s koeto 6te pravim vaktuler");
    scanf("%d",&f);
    rez=fact(f);
    printf("Faktoriel na 4isloto %d e %d",f,rez);
    return(0);
}
int fact (int num){
int factoriel=1;
for (double long i=1;i<=num;i++)
factoriel=factoriel*i;
return (factoriel);
}

ПП: Според мен тук "int f,rez;" или rez=fact(f); нещо трябва да се корегира, но не знам какво.

Провери за компилатора, платформата кое е най-дългото поддържано цяло число, трябва ти 64-битово

По-горе обясних защо.

П.П. Пробвай с long long

capnemo прав си - зависи от компилатора - ако под int разбира 32 битово цяло число е възможно наистина да се изчисли до 12! с горната програма, за 13! ще му трябва 64 битово.

capnemo прав си - зависи от компилатора - ако под int разбира 32 битово цяло число е възможно наистина да се изчисли до 12! с горната програма, за 13! ще му трябва 64 битово.

именно, не се усетих че на някои платформи int е 32-битово :tease:

Проблема е че С има различни имплементации даже на конкретна платформа и трябва да се сметне какви са граничните стойности на типовете

Хммм double long свърши до някъде работа след като замених на реда с for: int с double long ги докарах до 12 след това ми ги дава с минус :P Някакви идеи ?

#include <stdio.h>
int main ()
{
    int fact(int);
    int f,rez;
    printf("Vavedete 4islo s koeto 6te pravim vaktuler");
    scanf("%d",&f);
    rez=fact(f);
    printf("Faktoriel na 4isloto %d e %d",f,rez);
    return(0);
}
int fact (int num){
int factoriel=1;
for (double long i=1;i<=num;i++)
factoriel=factoriel*i;
return (factoriel);
}

ПП: Според мен тук "int f,rez;" или rez=fact(f); нещо трябва да се корегира, но не знам какво.

За да върши работа всички променливи които участват в изчислението - rez, factoriel включително и функцията fact()

трябва да са double long ако така се означава 64 битово цяло число.

Има вариант да се изведе факториел до 15 и само с int ако се махнат нулите накрая - тогава 32 бита ще стигнат, само не знам дали даскала ще го приеме за вярно.

rez = fact(12)/100

rez = rez * 13 - като при разпечатването извеждаш rez и 00 след него и става 6227020800

rez = rez * 14 ...................................rez и 00 .................87178291200

rez = rez / 2 * 3 ................................rez и 000 ..............1307674368000

Редактирано от ined (преглед на промените)

Ахъм, а защо не ползвате ползвате unsigned променливи. Има няма дигат 2 пъти големината на числото...

не помага много, вдига само два пъти размера, а факториал разсте неприлично бързо :P

За да върши работа всички променливи които участват в изчислението - rez, factoriel включително и функцията fact()

трябва да са double long ако така се означава 64 битово цяло число.

Има вариант да се изведе факториел до 15 и само с int ако се махнат нулите накрая - тогава 32 бита ще стигнат, само не знам дали даскала ще го приеме за вярно.

rez = fact(12)/100

rez = rez * 13 - като при разпечатването извеждаш rez и 00 след него и става 6227020800

rez = rez * 14 ...................................rez и 00 .................87178291200

rez = rez / 2 * 3 ................................rez и 000 ..............1307674368000

то методи много, може натрупването изкуствено да се раздели в две променливи, да се играе с BCD или даже аски пакетиране

Що да не помогне бре Капитане? Един 64 битов uint дава размер 264 - 1 = 18446744073709551615, при 15! = 1307674368000 - белким стигне! В C# типът се казва System.UInt64, а в C/C++ типът е unsigned long long (ако го поддържа платформата), след което започваме с извращенията uint64_t, uint64_c и т.н.

Що да не помогне бре Капитане? Един 64 битов uint дава размер 264 - 1 = 18446744073709551615, при 15! = 1307674368000 - белким стигне! В C# типът се казва System.UInt64, а в C/C++ типът е unsigned long long (ако го поддържа платформата), след което започваме с извращенията uint64_t, uint64_c и т.н.

не, не ме разбра, имах предвид че дали ще е signed или unsigned не помага много, защото разликата им е 2, докато растежа на факториал (както е по-горе) е 15. Иначе още в първите постове споменах long long, но на С специално дължината на типовете не е строго дефинирана и зависи от платформата и реализацията на компилатора. Даже имам спомени че преди много време срещах пример как с проста програмка да разберем конкретен тип каква точно дължина на думата има

Мислям че това беше само за int типа, че следва дължината на думата на платформата, а long-а е фиксиран 32 битов тип...

Мислям че това беше само за int типа, че следва дължината на думата на платформата, а long-а е фиксиран 32 битов тип...

мисля си че важеше и за други типове, даже имам спомени за 31 битов, и за 16 битов char :)

Но както и да е, човека просто трябва да провери дали double long или long long са 64 битови и да си дефинира всички променливи и функции с този тип

мисля си че важеше и за други типове, даже имам спомени за 31 битов, и за 16 битов char :)

Но както и да е, човека просто трябва да провери дали double long или long long са 64 битови и да си дефинира всички променливи и функции с този тип

Откачена работа, long е 32 битов за всичко освен за Unix 64 (и то само за ANSI C). Е за тфа Язвата и Шишарката ползват типове с фиксирана дължина - няма портване, няма чудене, няма броене на байтове - песен!

Откачена работа, long е 32 битов за всичко освен за Unix 64 (и то само за ANSI C). Е за тфа Язвата и Шишарката ползват типове с фиксирана дължина - няма портване, няма чудене, няма броене на байтове - песен!

Да, странно е, ама като е мислен езика са имали други идеи хората (и други машини под ръка) :ph34r: А джава и шарп имат много по-високо ниво на абстракция от хардуера, за това и нещата са по-ясни и чисти там

Здравейте направили сме в клас програма, която изчислява факториел на числата до 12. За домашно господина ни е дал да я поправим, така че да може да изчислява и 13 14 15 (само тези трите). Ще ви помоля да напишете кратко обяснение, защо точно така го променяте, защото най-вероятно ще иска да му обясним.Програмата трябва да е на C. Мерси предварително.

#include <stdio.h>
int main ()
{
    int fact(int);
    int f,rez;
    printf("Vavedete 4islo s koeto 6te pravim vaktuler");
    scanf("%d",&f);
    rez=fact(f);
    printf("Faktoriel na 4isloto %d e %d",f,rez);
    return(0);
}
int fact (int num){
int factoriel=1;
for (int i=1;i<=num;i++)
factoriel=factoriel*i;
return (factoriel);
}

Ето ти кода надявам се да ти свърши работа , мисля че така изглежда по добре :rolleyes:

#include <iostream>
using namespace std;

typedef long long INT;
INT fact(int);

int main ()
{ 
	int f;
	INT rez;
	cout<<"Vavedete cqlo polojitelno chislo: ";
    cin>>f;
    rez=fact(f);
    cout<<f<<" faktoriel e ravno na "<<rez<<endl;
    return(0);
}
INT fact (int num){
INT factoriel=1;
for (int i=1;i<=num;i++)
factoriel=factoriel*i;
return (factoriel);
}

За да разбереш максималната допустима стойност на даден тип използвай ф-ята sizeof(), тя връща размерността на променлива от този тип в байтове

размера на дефинирания тип INT е 8 байта което означава че макс. допустима стойност за този тип е 2 на степен 64 делено на 2 минус 1 , тоест 9223372036854775807 ( 19 цифри ) , сега ако си кажеш аджеба колко факториел мога да сметна с това число отговора е 20 факториел :)

Поздрави sdn !

  • 5 години по-късно...

Здравейте,

Аз не искам да отговоря, а по-скоро да Ви попитам как да проверя цифрите в един масив в С++...?

Благодаря предварително!

може ли по-скоро да ми отговорите бе хорицааааа...

 

Редактирано от Пепа Петкова (преглед на промените)

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Публикацията ви съдържа термини, които не допускаме! Моля, редактирайте съдържанието си и премахнете подчертаните думи по-долу. Ако замените букви от думата със звездички или друго, за да заобиколите това предупреждение, профилът ви ще бъде блокиран и наказан!
Напишете отговор в тази тема...

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.