Пятница, 29 Ноября 2024, 12:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Подсчёт суммы цифр числа
JSentДата: Пятница, 25 Октября 2013, 22:58 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Здравствуйте.
Казалось бы, простая задача о нахождении суммы цифр в трёхзначном числе загнала меня в тупик. Дело в том, что к задаче есть особое требование: все переменные должны быть типа float (исключение для счётчиков). Из-за этой беды вариант с цикличным нахождением остатка от деления на 10 не пройдёт, ведь он работает только для целых чисел.

Речь идёт о чистом С.

Прошу помочь хорошими идеями.


Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.
kvestproДата: Пятница, 25 Октября 2013, 23:33 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Си не знаю, но вот примерный алогритм:
1. Читаем число
2. Цикл
3. Отнимаем от числа единицу
3.1 счетчик= счетчик+1
4. Делим число на 10 и записывем его в новую переменную (например a)
Делим a на 10
5. Если a равно round(a) (если дробная часть равна нулю), то выходим из цикла, а иначе повторяем.
Теперь делаем такой же цикл, но уже делить будем на 100 (в счетчик добавляем по единице)
После этого еще один цикл, но проверяем уже a на равенство нулю.
Надеюсь, что понятно.

Вот на паскале, язык простой, так что думаю буду понят.
Program SummaCifr;
Var b, a:real;
St:integer;
Gotovo:boolean;
Begin
Readln(b);
A:=b
While gotovo=false do
Begin
A:=a-1;
St=st+1;
A:=a/10
If a=trunc(a) then gotovo:=true else gotovo:=false;
End;
Gotovo:=false;
A:=b;
While gotovo=false do
Begin
A:=a-10;
St:=st+1;
a:=a/100
If a=trunc(a) then gotovo:=true else gotovo:=false;
End;
Gotovo=false;
A:=b;
While gotovo=false do
Begin
A:=a-100;
St:=st+1;
If a=0 then gotovo:=true else gotovo:=false;
End;
Writeln(St);
End.

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


Инверсная кинематика в Unity
Алгоритм поиска пути Jump Point Search


Сообщение отредактировал kvestpro - Пятница, 25 Октября 2013, 23:51
DeswingДата: Суббота, 26 Октября 2013, 01:22 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Здесь был баян. Не дочитал сообщение(

Сообщение отредактировал Deswing - Суббота, 26 Октября 2013, 01:22
froexДата: Суббота, 26 Октября 2013, 15:27 | Сообщение # 4
Руководитель Froexilize team
Сейчас нет на сайте
JSent,
Код
    float inputValue; // введенное пользователем число
      float lSum = 0; // сумма цифр слева от запятой
      printf("Введите вещественное число.\n");
      scanf("%f", &inputValue); // пользователь вводит вещественное число
      if(inputValue < 0)inputValue*=-1; // убираем знак числа для упрощения расчётов
      inputValue = (int)inputValue; // целую часть числа сохраняем отдельно
      /* программе не известно количество цифр в числе, поэтому будем считать в цикле,
      пока есть с чем работать, постепенно удаляя по одной цифре из числа */
      while(inputValue>0){
          /* т.к. число разделили на вещественную и целую части, переносим по одному
          символу из целой части в вещественную, а их легко отловить */
          inputValue = inputValue/10;
          lSum+=inputValue - (int)inputValue; // отловленную цифру включаем в сумму ...
          inputValue = (int)inputValue; // ... и удаляем из нашего числа
      };
      lSum = (int)(lSum*10);
      printf("%f", lSum);

Возможно также вычислять и сумму цифр вещественной части, тогда необходимо сохранить её отдельно и по аналогии составить цикл, только переносить по одной цифре в действительную часть. Тут проблема может возникнуть из-за появления лишних цифр при сдвиге числа влево. Это необходимо учесть.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Суббота, 26 Октября 2013, 15:31
kvestproДата: Суббота, 26 Октября 2013, 15:45 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
froex, у меня что-то неправильно?

Инверсная кинематика в Unity
Алгоритм поиска пути Jump Point Search
shizofrenДата: Суббота, 26 Октября 2013, 16:12 | Сообщение # 6
Starting MS-DOS...
Сейчас нет на сайте
Код

#include<iostream>
#include<sstream>
#include<string>
using namespace std;
int main()
{
      float number, sum, nums[3];
      string s_number;

      //Вводим число
      cout << "Enter number: ";
      cin >> number;

      //Перобразуем это число в строку
      ostringstream ost;
      ost << number;
      s_number = ost.str();

      //Раскладываем три первых символа строки на int-переменные
      for(int i=0; i<3; i++)
      {
          istringstream ist(s_number.substr(i,1));
          ist >> nums[i];
      }

      //Выводим сумму этих трех чисел
      sum = nums[0] + nums[1] + nums[2];
      cout << sum << endl;

      return 0;

}



Моя команда

Сообщение отредактировал shizofren - Суббота, 26 Октября 2013, 16:57
froexДата: Суббота, 26 Октября 2013, 16:15 | Сообщение # 7
Руководитель Froexilize team
Сейчас нет на сайте
Цитата kvestpro ()
froex, у меня что-то неправильно?

У тебя паскаль, автор топика спрашивал про вариант на Си. Я код не глянул. Могу разобрать и высказать примечания, если интересно.
shizofren, у тебя С++, а не Си.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
mobipakДата: Суббота, 26 Октября 2013, 16:17 | Сообщение # 8
Подрывник
Сейчас нет на сайте
Реализовывать это куда легче (правда, в javascript нету дробления чисел на типы данных).

Вот код на JS:

Код
var sum = 1234567890;

var str = String(sum);

for(i=0; i < str.length; i++){
   var res = i != 0 ? res + Number(str.charAt(i)) : 0;
}
res += Number(str.charAt(0));

alert(res); // 45


Сообщение отредактировал mobipak - Суббота, 26 Октября 2013, 16:18
shizofrenДата: Суббота, 26 Октября 2013, 16:18 | Сообщение # 9
Starting MS-DOS...
Сейчас нет на сайте
Цитата froex ()
shizofren, у тебя С++

Я просто высказал идею. Если ТС понравится мой алгоритм, он перепишет с использованием обычного С.


Моя команда
froexДата: Суббота, 26 Октября 2013, 16:27 | Сообщение # 10
Руководитель Froexilize team
Сейчас нет на сайте
Кажется, почти никто не обратил внимание на условие работы с вещественными числами.

Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
shizofrenДата: Суббота, 26 Октября 2013, 16:57 | Сообщение # 11
Starting MS-DOS...
Сейчас нет на сайте
froex, с string вариантом это не проблема.

Моя команда
froexДата: Суббота, 26 Октября 2013, 17:02 | Сообщение # 12
Руководитель Froexilize team
Сейчас нет на сайте
shizofren,
Цитата JSent ()
к задаче есть особое требование: все переменные должны быть типа float (исключение для счётчиков).


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
shizofrenДата: Суббота, 26 Октября 2013, 17:14 | Сообщение # 13
Starting MS-DOS...
Сейчас нет на сайте
froex, абсолютно все? Что за бред.

Моя команда
froexДата: Суббота, 26 Октября 2013, 17:30 | Сообщение # 14
Руководитель Froexilize team
Сейчас нет на сайте


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Суббота, 26 Октября 2013, 17:30
shizofrenДата: Суббота, 26 Октября 2013, 19:17 | Сообщение # 15
Starting MS-DOS...
Сейчас нет на сайте
Цитата froex ()
И, да, не надо ко мне с вопросами приставать, не я тему создавал.

Что?


Моя команда
kvestproДата: Суббота, 26 Октября 2013, 19:36 | Сообщение # 16
заслуженный участник
Сейчас нет на сайте
froex, да, а то я проверить не могу.
мой алгоритм использует float числа и integer счетчик.

Добавлено (26.10.2013, 19:36)
---------------------------------------------
froex, да, а то я проверить не могу.
мой алгоритм использует float числа и integer счетчик.


Инверсная кинематика в Unity
Алгоритм поиска пути Jump Point Search
shizofrenДата: Суббота, 26 Октября 2013, 19:51 | Сообщение # 17
Starting MS-DOS...
Сейчас нет на сайте
Вот, здесь чистый С и нет ни одной переменной типа int

Код

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

int getIntFromFloat(float fnum);
int getNumber(float numberNum, float number);

int main()
{
     float number;

     printf("Enter number: ");
     scanf("%f",&number);

     printf("%d",getNumber(1,number)+getNumber(2,number)+getNumber(3,number));
     return 0;
}

int getNumber(float numberNum, float number)
{
     switch(getIntFromFloat(numberNum))
     {
     case 3:
         return getIntFromFloat(number)%10;
         break;
     case 2:
         return ((getIntFromFloat(number) % 100)-getIntFromFloat(number)%10)/10;
         break;
     case 1:
         return (getIntFromFloat(number)-(getIntFromFloat(number) % 100))/100;
         break;
     }
}

int getIntFromFloat(float num)
{
     return round(num);
}



Моя команда
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг