Prateek Krishna Ответов: 3

Я попробовал этот код, чтобы узнать сумму факториала первых n натуральных чисел . Но это не показывает желаемого результата..


#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,j,sum=0,f=1;
	printf("enter the value of no upto which you want to print the sum");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	 {
	 	
	 	for(j=i;j>=1;j--)
	 	{
		 
	 	f=f*j;
	 	sum=sum+f;
	    }
	 	
	 }
	 printf("sum is %d",sum);
	 return 0;
}

[edit]добавлен блок кода-OriginalGriff [/edit]

Что я уже пробовал:

#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,j,sum=0,f=1;
	printf("enter the value of no upto which you want to print the sum");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	 {
	 	
	 	for(j=i;j>=1;j--)
	 	{
		 
	 	f=f*j;
	 	sum=sum+f;
	    }
	 	
	 }
	 printf("sum is %d",sum);
	 return 0;
}

3 Ответов

Рейтинг:
2

CPallini

У вас слишком много петель.
Попробуй

#include<stdio.h>
#include<math.h>

int main()
{
  int n , i, sum=0, f = 1;
  printf("enter the value of no upto which you want to print the sum ");
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
    f=f*i;
    sum=sum+f;
  }
  printf("\nsum is %d\n",sum);
  return 0;
}


Обратите внимание, что такая программа работает пока n<13:
  • 13! слишком велик для int (самонадеянный 32 немного).
  • 21! было бы слишком большим для long long (самонадеянный 64 немного).


Рейтинг:
1

Patrice T

Цитата:
Но это не показывает желаемого результата..

Это не информативно.
Поскольку это какое-то домашнее задание, я не даю вам код, просто советы, изучите отладчик, это отличный инструмент, и он поможет вам учиться быстрее.

Возьмите лист бумаги и карандаш. Решите задачу вручную для небольших чисел, 1, 2, 3, 4. Запишите, как вы ожидаете, что переменные будут развиваться, используйте 1 строку за изменение.
sum= 0
... f= 1!
sum= sum+ f
... f= 2!
sum= sum+ f
...

Затем запустите свою программу на отладчике, выполняйте построчно и проверяйте переменные по мере их изменения, когда переменные начинают делать что-то неожиданное, вы близки к ошибке.
-----
Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить почему. Поставить точку останова на строке:
for(i=1;i<=n;i++)

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!

Да, я, наверное, мог бы сказать вам, в чем "проблема" - но сделать это самому несложно, и при этом вы узнаете что-то действительно стоящее!


Prateek Krishna

я не могу этого понять.
пожалуйста, напишите более простым способом.

Dave Kreskowiak

Ты серьезно только что попросила его сделать за тебя домашнее задание?

Prateek Krishna

нет
но это срочно

OriginalGriff

Тогда вам следовало начать раньше: вы знали, когда это должно было произойти.
Займись делом и начинай работать. Вы теряете время, которое вам может понадобиться, пытаясь заставить нас сделать это за вас...

OriginalGriff

Нет. Это ваше домашнее задание, а не мое , и вы ничему не научитесь, если я предложу вам решение.

Это не сложно - и отладка-это навык, который лучше всего начинать разрабатывать на небольших приложениях: те же методы применимы и к большим, но очень трудно заставить их работать, если вы не знаете их и не знаете, как их применять.

Prateek Krishna

окей

Prateek Krishna

сэр, в чем здесь основная ошибка?

OriginalGriff

Используйте отладчик и узнайте! :смеяться:

Prateek Krishna

что это?

OriginalGriff

Это большое здание с пациентами, но сейчас это не важно.

Что есть что?

[no name]

Я думаю, что мистеру Пратику нужно больше внимания, и извините, если вы не понимаете из этого 40-строчного ответа Гриффа сэра.