Вычисление суммы цифр умноженной на длину строки - PullRequest
1 голос
/ 01 декабря 2011

На прошлой неделе у меня был проект от моего учителя, который попросил меня разработать программу, которая принимает строку (точный поток целых чисел) и вычисляет сумму чисел в строке для каждого числа в строке, т. Е.

, если на входе 31456

  • 1-й цикл ничего не делает (без номера слева от 3 с результатом суммы 0)
  • 2-й цикл заканчивается на 3 (с результатомна сумму 3)
  • 3-й цикл заканчивается на 1 (с результатом 3 + 1 = 4)
  • 4-й цикл заканчивается на 4 (с результатом 3 + 1 + 4 = 8)
  • 5-й цикл заканчивается на 5 (с результатом 3 + 1 + 4 + 5 = 13)
  • 6-й цикл заканчивается на 6 (с результатом 3 + 1 + 4 + 5 + 6 = 19)

Я представил рабочий проект, но он полон кода спагетти (вложенные циклы, которые заканчиваются, если длина строки меньше, чем число циклов), что не является чистым подходом.Я задавался вопросом и изучил довольно много над этой ситуацией напрасно.Я не нашел способа сделать это без вложенных циклов в C (или, может быть, я сдался слишком быстро?)

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

Ответы [ 7 ]

3 голосов
/ 01 декабря 2011

Вот мой совет: перестаньте думать «петлями» и начинайте думать «шагами». Если входная строка содержит n символов, у вас есть n+1 шагов.

Теперь подумайте над следующими тремя вопросами:

  1. Знаете ли вы решение первого шага (без цифр)?
  2. Учитывая решение для шага k, как вы можете вычислить решение для шага k+1?
  3. Как вы можете объединить вопросы 1 и 2 для решения всей вашей проблемы всего за один цикл?

Так как это домашнее задание, я позволю вам взять его отсюда.

0 голосов
/ 10 августа 2018
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


static void printResults(int* results,int size);
int main( int argc, char** argv ){
    char nums[] = "314156";/* "31456" ? */
    int i,tmp;
    char tmpc[2];
    int length=strlen(nums);
    #define LENGTH length
    int results[LENGTH];
    results[0]=0;
    tmpc[0]=nums[0];
    sscanf(tmpc, "%d", &tmp);
    results[1]=tmp;
    int result=results[1];
    for(i=2 ; i< length ; ++i){
            tmpc[0]=nums[i];
            sscanf(tmpc, "%d", &tmp);
            result+=tmp;
            results[i]=result;
    }
    printResults(results,length);
    return 0;
}

static void printResults(int* results,int size){
    int i;
    for(i=0;i<size;i++){
       printf("%d time loop sum is %d\n", i+1,results[i]);
    }

}

Это действительно простой и понятный код на C для начинающих, и результат:

output

0 голосов
/ 29 ноября 2013
#include<iostream>
#include<cctype>
using namespace std;
void main()
{
const int SIZE=10;
char myArray[SIZE];
int length=0,sum=0;
cout<<"enter Array of digit from 1-9\n\n ";
cin>>myArray;
cout<<myArray<<endl;
for(int i=0;i<myArray[i];i++)
{
    if(!isspace(myArray[i]))
    //if(myArray[i]!=NULL)

    length++;
}
    cout<<length<<endl;


for(int i=0;i<length;i++)
{
    sum+=myArray[i]-'0';

}



    cout<<sum;
    }
0 голосов
/ 01 декабря 2011

Существует функция стандартной библиотеки C ++ под названием partial_sum(), которая выполняет серию сумм, которые вы описываете, за один проход для ввода.

int sums[] = { 0, 3, 1, 4, 1, 5, 6 };

std::partial_sum(sums, sums + 7, sums);

// The results are left in sums[0]..sums[6]
0 голосов
/ 01 декабря 2011
#include <stdio.h>

int sum(const char ch){
    static int sum = 0;
    int retValue = sum;

    sum += ch -'0';

    return retValue;
}

int main(){
    char nums[] = "314156";/* "31456" ? */
    int size = sizeof(nums)/sizeof(char);
    int i;

    for(i=0 ; i< size ; ++i){
        printf("%d time loop sum is %d\n", i+1, sum(nums[i]));
    }

    return 0;
}

DEMO

1 time loop sum is 0
2 time loop sum is 3
3 time loop sum is 4
4 time loop sum is 8
5 time loop sum is 9
6 time loop sum is 14
7 time loop sum is 20
0 голосов
/ 01 декабря 2011

Псевдокод:

array of sums
sums[0] = 0;              // That first time that you want to get 0!!
for i = 1 to length of str
    sums[i] <- sums[i-1] + str[i]
0 голосов
/ 01 декабря 2011

Если я вас правильно понял

double temp = 0;
for(int i = 0; i < str.Length; i++)  // str is your complete number
{
   temp += Convert.ToDouble(str[i]);
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...