2010-07-14 4 views
0

Я не могу получить коды правильно. Может ли кто-нибудь помочь?написать программу для выполнения sum = 1+ (1 + 2) + (1 + 2 + 3) + ... + (1 + 2 ... + n)

#include<stdio.h> 
int main() 
{ 
int n, sum,i,j; 

printf("Please enter an integer, n = "); 
scanf("%d", &n); 

for(i=1;i<=n;i++) 
    for(j=1;j<=i;j++) 
     sum = sum + n; 
printf("sum = %d", sum); 


return 0; 
} 
+8

Добавьте некоторые фигурные скобки. Код является единственным. –

+5

Почему это помечено как C++? Это код C. –

+0

@Steven: FWIW, это также законный код на C++. Не то, чтобы я преподавал начинающему C++ о 'scanf()'. –

ответ

10
  1. Вы не Инициирование sum. Инициализируйте его 0.
  2. Вы не должны добавлять n на каждом шагу, но j.

Конечно, это исправить текущий код. Есть более эффективные подходы к решению проблемы, о которых уже говорили другие.

Edit:

Просто для удовольствия, вот формула, которая позволяет решить проблему в O(1):

Ваша сумма равна n*(n + 1)*(2*n + 1)/12 + n*(n + 1)/4.

Это достигается путем записи его в виде суммы и используя тот факт, что сумма первых n последовательных квадратов n(n + 1)(2n + 1)/6 и сумма первых n положительных целых чисел является n(n + 1)/2. +1, если вы можете найти более приятную форму формулы.

+0

спасибо большое. ранее я продолжал изменять j и n, но до сих пор не смог получить решение. теперь я понимаю, что проблема была инициализацией. – user391967

+0

вот он, мои коды. gee, есть так много математических формул. спасибо в любом случае. #include int main() { \t int n, sum = 0, i, j; \t \t printf ("Введите целое число, n ="); \t зсапЕ ("% d", &n); \t \t для (я = 1; г <= п; я ++) \t \t для (J = 1, J <= я; j ++) \t \t сумма = сумма + J; \t \t Е ("сумма =% d", сумма); \t \t \t возврат 0; } – user391967

+0

@ user391967 - только так вы знаете, что вам не нужно 2 для петель для достижения этой цели – JonH

1

Подумайте об этом. У вас есть одна сумма, которую вы накапливаете, и у вас есть ряд значений. Каждое значение может быть сгенерировано из предыдущего путем добавления индекса. Итак, почему у вас есть вложенные петли?

9

Нет необходимости рекурсии, просто посмотрите на математику:

1 + (1+2) + (1+2+3) + ... + (1+2+3+...+n) 

равно

1*n + 2*(n-1) + 3*(n-2) + ... + n 
+0

Мне было просто интересно то же самое - я не носитель языка, но я просто почувствовал, что здесь что-то не так ... спасибо за то, что вы меня навязывали. –

+1

@ GMan: Сотрудник просто сказал, что это британский, интересный. Снято :) – Stephen

+0

@ Stephen: Я только что прочитал «Призрак Кантервиля» сегодня, и никто не мог сказать это как Оскар Уайльд: «... отличный пример того, что [англичане] действительно имеют все общее с Америкой в ​​наши дни, кроме, конечно, языка ». –

0

Вы никогда не инициализировать sum, поэтому вы добавляете все случайное значение мусора. Палка sum = 0; перед вашими петлями

0

Doing это итеративно, как вы пробовали:

#include <stdio.h> 

int main() { 
    int i, t, n, sum; 
    printf("Please enter an integer, n = "); 
    scanf("%d", &n); 
    t = sum = 0; 
    for (i = 1; i <= n; ++i) { 
     t += i; 
     sum += t; 
    } 
    printf("sum = %d\n", sum); 
    return 0; 
} 

Но есть замкнутая форма формула, как предложил IVlad.

+2

Для домашних заданий мы предпочитаем не просто дать им полный рабочий код ... –

+0

Вы правы. Я согласен с этим. – Asker

0

Начните с математики, посмотрите, можете ли вы найти какой-либо узор.

if n = 0 , res = 0? 
if n = 1 , res = 1 
if n = 2 , res = 1 + (1+2) 
if n = 3 , res = 1 + (1+2) + (1+2+3) 

для каждого n, res is ??

+0

Похоже, что некоторые учителя отмечают сумму, основанную на полученном ярлыке/известном ответе. – maxwellb

+0

Говорить ему догадываться, что это не полезно. Существуют алгоритмы для получения формулы. – IVlad

+0

@IVlad: Есть, но я уверен, что здесь нужно научиться использовать циклы. –

0

Попробуйте это:

int main(void) 
{ 
    int total=1; 
    int sumtotal = 0; 
    int n=5; 

    for(int i=1; i<=n; i++) 
    { 
     total+=i; 
     sumtotal+=total; 
    } 
    //sumtotal should give you 1+(1+2)+(1+2+3) 
    return 0; 
} 
+1

Домашнее задание. Проблема. –

5

Не то, что вы ожидали, но это является лучшим решением;)

int calculate (int n) { 
    return (2*n + 3*n*n + n*n*n)/6; 
} 
+0

+1 для хорошей формулы. Могу я спросить, как вы к ней пришли? – IVlad

+0

Теперь я вижу, что вы дали аналогичный ответ. Я использовал те же формулы для суммы ints и суммы квадратов. Вы просто не закончили расчет. BTW, sth дал еще лучший результат в комментарии выше. – zvone

0

Try:

int main(void) 
{ 
    int  n, sum; 

    printf("\nPlease enter a postive integer value");  
    scanf("%d", &n); 
    sum = n * (n + 1)/ 2; 
    printf("\n%d", sum); 
    return 0; 
} 
+0

Это дает значение для 1 + 2 + ... n, а не 1+ (1 + 2) + .... + (1 + 2 + n). –

-1

п * (п - (n - 1))

int n, sum 

for n = 0; n <= 3; n ++ { 
    sum += n * (n -(n - 1)) 
} 

работы для факториалов тоже (оператор изменения и установить сумму в 1):

int n, sum 

sum = 1 

for n = 0; n <= 3: n++{ 
    sum *= n * (n -(n -1)) 
} 
+0

Это недопустимо C. Кроме того, '(n - (n - 1))' равно 1, так что вы действительно просто делаете 'sum + = n' на каждой итерации. – jwodder

+0

* facepalm * спасибо, что указали это, не знаю, почему я не понял, что раньше –