Премини към съдържанието
  • Добре дошли!

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

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

     

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


dimbadboy

Препоръчан отговор

Здравейте направили сме в клас програма, която изчислява факториел на числата до 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:

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

Линк към коментара
Сподели в други сайтове

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

Линк към коментара
Сподели в други сайтове

Хммм 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 години по-късно...

Здравейте,

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

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

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

 

Редактирано от Пепа Петкова (преглед на промените)
Линк към коментара
Сподели в други сайтове

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

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

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

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Добави ново...