Подсчёт суммы цифр числа
| |
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); }
Моя команда
|
|
| |
|