LINUX.ORG.RU

Д/з по С++


1

3

Вот, собсно, само задание:

Дано натуральное число а (a≤100). Напишите программу, определяющую количество цифр в этом числе, сумму его цифр, выводящую на экран первую и последнюю цифру через два пробела.
Что-то ничего в голову не лезет, помогите пожалуйста

★★★★★

number.cpp:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  unsigned int number, first, last, i, sum = 0, count = 1;

  if (argc < 2)
    {
      printf("Usage:\n./number num\n");
      return 1;
    };

  number = atoi(argv[1]);
  last = i = number % 10;
  number /= 10;
  sum += i;

  while(number>0)
    {
      i = number % 10;
      number /= 10;
      sum += i;
      count += 1;
    };

  first = i;
  printf("%i  %i\ncount = %i, sum = %i, \n", first, last, count, sum);
  return 0;
};

calc $ g++ number.cpp -o number
calc $ ./number 0
0  0
count = 1, sum = 0, 
calc $ ./number 12
1  2
count = 2, sum = 3, 
calc $ ./number 31
3  1
count = 2, sum = 4, 
calc $ ./number 100
1  0
count = 3, sum = 1, 
calc $ ./number 97
9  7
count = 2, sum = 16, 

bukaka
()
Ответ на: комментарий от bukaka

Теперь вам остается добавить всяких велосипедных классов и получится то, что нужно ТСу ;)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Dimanc

Ты же используешь его при счете?

Это с каких пор ноль стал натуральным? Это число не так уж и давно вообще появилось...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Dimanc

>Ты же используешь его при счете?
Как число — нет.

x3al ★★★★★
()
Ответ на: комментарий от Eddy_Em

Обычно в теории чисел - 0 не натуральный, а в computer science - натуральный.

Raving_Zealot ★★
()
Ответ на: комментарий от AIv

> печатаешь его в какой нить буфер, потом посимвольно обрабатываешь

Типичный подход С++-кодера. Сделать медленно и через одно место.

anonymous
()
Ответ на: комментарий от anonymous

Это как в том анекдоте про программиста, который зашел в ступор, пытаясь досчитать до 5, начиная с нуля :)

Eddy_Em ☆☆☆☆☆
()
Eval [
    | value |
    value := Smalltalk getArgv: 1.
    
    Transcript
        << value size; nl;
        << (value inject: 0 into: [:a :e | a + e asString asInteger]); nl;
        << value first; space; space; << value last; nl
]
yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

Ну почему, метод решения через преобразование в строку не намного хуже метода через деления и остатки. Особенно в такой конкретной задаче.

а как по вашему реализовано преобразование в строку?

bukaka
()
Ответ на: комментарий от bukaka

> это медвежья услуга. пусть пользуется. больше достанется работы думающим людям.

Зачем?! Пусть платит. Платит здесь за программы, потом платит репетиторам чтобы с этой программой получить зачет, потом платит преподавателю чтобы не вылететь без зачета. Ты людей заработка лишаешь.

Manhunt ★★★★★
()
Ответ на: комментарий от Eddy_Em

> Зато длина числа может быть хоть 1000 символов ;)

если пользоваться atoi, itoa, sprintf то не может - ограничение типа long

bukaka
()
Ответ на: комментарий от Manhunt

> Зачем?! Пусть платит. Платит здесь за программы, потом платит репетиторам чтобы с этой программой получить зачет, потом платит преподавателю чтобы не вылететь без зачета. Ты людей заработка лишаешь.

виноват, не подумал. :-)

bukaka
()
Ответ на: комментарий от anonymous

>Как можно 0 использовать при счёте? Ты говоришь что-то типа «я имею 0 ноутбуков»?

элемент 0, элемент 1, ..., элемент n - 1

Dimanc ★★
()
#!/usr/bin/guile -s
!#
(define (numb a)
             (define (pow10 x)
                          (if (= x 0) 1 (* 10 (pow10 (- x 1)))))

             (define (numb-iter a i s)
                          (cond ((= a 0) 
                                      ((lambda (x y) 
                                                      (display x) 
                                                      (newline) 
                                                      (display  y) 
                                                      (newline) 
                                                       i)
                                        i s))
                          (else (numb-iter (floor (/ a 10)) (+ i 1) (+ s (remainder a 10))))))

             (if (<= a 0) 
                 ((lambda (x) (display "Phail!") 0) a)
                 ((lambda (x) 
                             (display (floor (/ a (pow10 (- x 1))))) 
                             (display "  ") 
                             (display (remainder a 10))
                             (newline) 
                             x) 
              (numb-iter a 0 0))))

(numb (read))

Думаю, на С++ переведешь.

//Не бейте ногами, я еще только на 84 странице SICP.
//Да, где подсветка для scheme?

 указал.

unikoid ★★★
()
Ответ на: комментарий от anonymous

>Как можно 0 использовать при счёте? Ты говоришь что-то типа «я имею 0 ноутбуков»?

«Сколько у тебя осталось денег? --- Ноль.»

anonymous
()
Ответ на: комментарий от unikoid

>//Да, где подсветка для scheme? [code=scheme] указал.

Лиспом подсвечивай, элитист!

anonymous
()
Ответ на: комментарий от anonymous

>«Сколько у тебя осталось денег? --- Ноль.»
Деньги — не слишком материальный предмет.

x3al ★★★★★
()
Ответ на: комментарий от Dimanc

не так. нет элемента ноль. есть элемент со смещением 0, от начала коллекции (изначально массива, я взял шире).

dpt-ru
()
#include <iostream>
#include <cmath>

using namespace std;

int digit(int num, int i)
{
    int j, k = 1;
    for (j = 1; j < i; ++j)
        k *= 10;
    return num % (k * 10) / k;
}

int main()
{
    int x;
    cout << "Введите x = ";
    cin >> x;

    int sum = 0, i, n = int(log(x)/log(10)) + 1;
    cout << "Количество цифр: " << n << endl;
    for (i = n; i > 0; --i)
        sum += digit(x, i);
    cout << "Сумма цифр: " << sum << endl;
    cout << "Первая и последние цифры: " << digit(x, n)
         << "  " << digit(x, 1) << endl;
    return 0;
}

Не особо проверял. -___-

sbar
()
Ответ на: комментарий от yoghurt
print len(str(n)), sum(map(int, str(n))), str(n)[0], str(n)[-1]

;-)))

ЗЫ. Ох уж эти анонимумсы... где то в условии было сказано «обеспечить максимально возможную производительность»?

AIv ★★★★★
()
Ответ на: комментарий от dpt-ru

и это кстати Си, не C++. ну ты в курсе я думаю. ну или Си-стайл, суть та же.

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

bukaka
()
Ответ на: комментарий от bukaka

ну и к чему ты это? пришел, испортил тред, еще и не по сабжу написал. написано же C++, ему кстати по C++ был уже код (на шаблонах, жестко, прикольно, но плюсово, в отличии от). да и вариант с if-ами - вообще шикарный.

ему до тебя уже все решили xD

dpt-ru
()
Ответ на: комментарий от bukaka

Только ваш код ТСа никак не спасет. Ему же не по С д/з дали :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Dimanc

Элемент 0 является первым, элемент 1 является вторым и так далее. 0, 1, 2 и т.д. - всего лишь индексы и имена, но не реальный физический порядковый номер.

anonymous
()

лисп, смолтолк, си... добавлю в коллекцию:

my @a = get.chomp.split("");
say  + @a;
say [+]@a;
say "@a[0]  @a[*-1]";

;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

так не честно! get.chomp.split и т.п. - не по правилам!

anonymous
()

Ладно, что б было Цэ...

#include <Python.h>

int main( int argc, const char** argv ){
	char buf[4096]; snprintf( buf, 4095, "n='%s'\nprint len(n), sum(map(int, n)), n[0], n[-1]", argv[1] );
	Py_Initialize();
	PyRun_SimpleString( buf );
	return 0;
}
AIv ★★★★★
()
Ответ на: комментарий от AIv

Точнее так:

#include <Python.h>

int main(){
	Py_Initialize();
	PyRun_SimpleString( "n=raw_input('input number:')\nprint len(n), sum(map(int, n)), n[0], n[-1]" );
	return 0;
}

работает с положительными целыми числами любой длины;-))))

AIv ★★★★★
()
Ответ на: Ъ-быдлокод, C++ от Raving_Zealot

Спасибо! Так мне настроение давно никто не поднимал :)

По сабжу, регулярные выражения так и просятся в эту задачу:

void main()
{
 char pattern[] = "\\d";
 char a[256];
 pcre *re;
 scanf("%s",a);
 int options = 0;
 const char *error;
 int erroffset;
 re  =  pcre_compile ((char *) pattern, options, &error, &erroffset, NULL);
  if (!re){
    cout << "Failed\n";
  }
  else{
    int count = 0;
    int ovector[30];
    count  =  pcre_exec  (re,  NULL, (char *) a, strlen(a), 0, 0, ovector, 30);
    count << "Количество цифр: " << count << " последняя цифра:  " << a[ovector[2]] << " первая цифра " << (count == 2 ? a[ovector[4]] : a[ovector[2]];
    // а сумму цифр остается домашним заданием
  }
}


Ъ
amomymous ★★★
()

а почему еще никто в qt не вывел?

ono
()
Ответ на: комментарий от xydo

>MEGAFAIL!!

Но там ниже есть финальная версия этой почти идеальной программы!

Dimanc ★★
()
my $var = <>;
chomp $var;
my @nums = split //, $var;
my $sum;
foreach(@nums) {
	$sum+=$_;
}
print "sum: $sum left: $nums[0] right: $nums[-1]\n";
DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от bukaka

Что-то я очень удивен... чтобы на лоре.... да сделали дз за кого-то.. да и первым постом... и не послали в гугл.. и не обосрали «глупого школьника»...

Куда катится ЛОР??

Tanger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.