zadanie z petla for- prosba o pomoc :)

0

Pytanie teoretyczne od wiecznie początkującego amatora-hobbysty c++.
Program ma określić z ilu cyfr składa się liczba. Poszperałem w symfonii J.Grębosza i stworzyłem taki kod:


#include <iosream>
#include <string>

int main()
{
string ile;
std::cin >> ile; 
std::cout<<"\n";
std::cout<<ile.size();
return 0;
}


Autorzy zadania zamieścili je w dziale iteracje. Czy istnieje pętla for która działałaby tak:
Przy każdej kolejnej iteracji zwiększałaby dzielnik o wielokrotność 10 tj. pierwszy obrót pętli dzielimy liczbę podana przez użytkownika przez 10, następnie o 100, 1000 i tak dalej, aby dojść do momentu gdy liczba/dzielnik<1

Np. 120/10>1 100/10>1 1/10<1
120/100>1 100/100=1
120/1000<1 100/1000 <1
Trzy iteracje pętli, czyli liczba składa się z trzech cyfr. Jedna iteracja jedna cyfra

Na końcu wyświetliłbym komunikat:
cout<< „liczba składa się z: ” <<i<< „cyfr”;

Jak to jednak ogarnąć w c++ ?
Próbowałem coś takiego, ale nie działa. Dodatkowo, gdy liczba jest jedynka petla nie wykona sie ani razu 1/10<1

#include <iostream>
using namespace std;

main()

 { 
 int i;
 int dzielnik=10;
 int liczba;
std::cout<<"podaj liczbe: "<<std::"\n";
std::cin>>liczba;
std::cout<<"\n";

for (i=0;(liczba/dzielnik)>=1;i++)

{
if(liczba/dzielnik<1)
{

std::cout<<"liczba sklada sie z: "<<i<<"cyfr";
}
dzielnik=dzielnik*10;
}

 return 0;
}


Z góry dziękuję za wszelką pomoc

4

A nie możesz na każdym kroku podzielić przez 10?
Aczkolwiek autorzy zadania prawdopodobnie nie znają podstaw matematyki:

#include <cmath>
#include <iostream>
using namespace std;

int main()
{
	for(int value;(cout<<"Podaj wartosc: ")&&(cin>>value);)
	{
		cout<<"Wartosc "<<value<<" ma "<<max(1.0,floor(1+log10((double)value)))<<endl<<endl;
	}
	return 0;
}
0

@_13th_Dragon: > A nie możesz na każdym kroku podzielić przez 10?

mogę, ta pętla ze zwiększonym dzielnikiem o kolejne wielokrotności 10 ,to jest mój "pomysł", ponieważ autorzy założyli rozwiązanie iteracyjne. chciałem się tylko dowiedzieć, czy można stworzyć warunek do pętli for której założenia teoretyczne przedstawiłem tj by uwzględniała wszystkie liczby także te przedziału1-9.
Pozdrawiam

1
crispia napisał(a):

... pętla ze zwiększonym dzielnikiem o kolejne wielokrotności 10 ,to jest mój "pomysł"

Miałem na myśli raczej coś takiego:

#include <cmath>
#include <iostream>
using namespace std;

int main()
{
	for(int value,copy,count;(cout<<"Podaj wartosc: ")&&(cin>>value);)
	{
		for(count=0,copy=value;copy;copy/=10) ++count;
		cout<<"Wartosc "<<value<<" ma "<<max(1,count)<<endl<<endl;
	}
	return 0;
}
2

Pętla while ze zwiększaniem dzielnika:

#include <iostream>

using namespace std;

int main() {
    int n = 987654;
    int m = 1;
    int i = 0;
    while (1.0 <= n/m) {
        ++i;
        m *= 10;
    }
    cout << i;
}
0

@_13th_Dragon: twój poziom programowania to dla mnie całkowita abstrakcja, nawet za 100 lat się do niego nie zbliżę, zresztą nigdy nie zostanę programistą: jak wcześniej napisałem to moje hobby i to i tak z "doskoku" ale dziękuję za chęć pomocy. Pozdrawiam P.S "pomysł" na rozwiązanie poprzez dzielenie przez 10 jest oczywiście twój,ja "wymyśliłem" to nieszczęsne dzielenie przez wielokrotność 10 w petli for
@_KamilAdam Tobie też dziękuję za pomoc

1
crispia napisał(a):

@_13th_Dragon: twój poziom programowania to dla mnie całkowita abstrakcja,

Nie przesadzaj.

crispia napisał(a):

... nawet za 100 lat się do niego nie zbliżę, zresztą nigdy nie zostanę programistą

Dla chętnego nic trudnego.

Może dla przykładu kod od @KamilAdam, zapisałbym następująco:

#include <cmath>
#include <iostream>
using namespace std;

int main()
{
    for(int value,multiply,count;(cout<<"Podaj wartosc: ")&&(cin>>value);)
    {
        for(multiply=10,count=1;value>=multiply;multiply*=10) ++count; // jeden wiersz zamiast 6-ciu - czyli czytamy 6 razy szybciej
        cout<<"Wartosc "<<value<<" ma "<<count<<endl<<endl;
    }
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1