поменять цикл while на цикл for. на c++
while(absoluteN>0)
c++ помогите срочно
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N;
cin >>N;
if (N%1==0)
{
int sum=0;
int absN=abs(N);
while (absN>0)
{
sum+=absN%10;
absN/=10;
}
cout <<sum;
}
else
{
cout <<sqrt(abs(N));
}
return 0;
}
Ответы (2 шт):
Любая проверка на целое число может столкнуться ситуацией, когда результат ввода целого числа не "помещается" в заложенном типе. Есть значения int, которые не помещаются в double и если целые значения double которые не помещаются в int.
В исходном коде вообще запланировано только целое число - int N. Самым надежным является проверка на момент ввода.
У потоков есть метод good() для проверки состояния. Чтобы прочитать ввод повторно,можно воспользоваться строковым буфером-потоком std::stringstream.
#include <iostream>
#include <sstream>
#include <cmath>
int main()
{
int N;
double R;
// сохраним ввод пользователя
std::stringstream input;
input << std::cin.rdbuf();
// считаем как целое.
// Дробные числа МОЖНО считать как целое, если они не начинаются с точки.
input.seekg(0);
input >> N;
bool isInt = input.good();
// считаем как double
input.seekg(0);
input >> R;
bool isReal = input.good();
//bool isRound = (isInt && !isReal) || // записано как целое
// (isReal && (round(R) == R)); // является большим целым в экпс. форме.
if (isInt && !isReal) { // если число и не дробное
int sum = 0;
for (int absN=abs(N); absN > 0; absN /= 10) {
sum += absN % 10;
}
std::cout <<sum;
}
else {
if(isReal) {
std::cout << sqrt(abs(round(R)));
}
else {
std::cout << "Ошибка ввода";
}
}
return 0;
}
Конечно же, запись вроде 3.14e+12 описывает ЦЕЛОЕ число 3140000000000, которое не поместится в int, но, похоже, условия задачи такой вариант не рассматривают. Можно также исключить возможность ввода экспоненты.