• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

N podzielna przez 3

Object Storage Arubacloud
0 głosów
14,438 wizyt
pytanie zadane 31 października 2016 w C i C++ przez Ciri Gaduła (3,380 p.)

Mam napisać program, który będzie sprawdzał czy wpisana liczba jest podzielna przez 3. Ale nie ma się użyć tylko "n%3==0", ale trzeba zsumować wszystkie dzielniki, a następnie sprawdzić czy suma jest podzielna przez 3. Jeżeli jest większa niż 9, to trzeba te liczby jeszcze raz dodać.

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
	
	int i,l;
	char liczba[20];
	int suma=0;
	
	cout<<"Podaj liczbe : ";
	cin.getline(liczba,20); 	
	
	int dl=strlen(liczba);	// Ilość cyfr w liczbie
	
	cout<<dl<<endl<<endl;	//Wyświetlenie długości napisu
	
	for(i=0; i<dl; i++)
	{
		cout<<liczba[i]<<endl;
		suma=suma+liczba[i];	// Suma cyfr danej liczby - z tym mam problem, bo wychodzą mi dziwne wyniki
		
		
	}
	cout<<suma;
	
	if(suma%3==0)
	cout<<"Liczba jest podzielna przez 3";
	else
	cout<<"Liczba nie jest podzielna przez 3";
}

 

1 odpowiedź

+1 głos
odpowiedź 1 listopada 2016 przez criss Mędrzec (172,590 p.)
edycja 1 listopada 2016 przez criss

ale trzeba zsumować wszystkie dzielniki

Chyba cyfry.

 

    for(i=0; i<dl; i++)
    {
        cout<<liczba[i]<<endl;
        suma=suma+liczba[i];    // Suma cyfr danej liczby - z tym mam problem, bo wychodzą mi dziwne wyniki
         
         
    }

Sumujesz wartości znaków ascii. (żeby "przekonwertować" ascii znaku cyfry na wartość cyfry wystarczy odjąć od znaku wartość '0' - przyjrzyj sie tablicy znaków ascii i będziesz wiedziała dlaczego)

Jeżeli jest większa niż 9, to trzeba te liczby jeszcze raz dodać.

Tutaj nie rozumiem.

PS: na przyszłość - jeśli przychodzisz na forum z problemem, to napisz jaki jest twój problem. 

komentarz 1 listopada 2016 przez Ciri Gaduła (3,380 p.)

 (żeby "przekonwertować" ascii znaku cyfry na wartość cyfry wystarczy odjąć od znaku wartość '0'

Nie rozumem o co chodzi. Możesz jaśniej to zobrazować :)

 

Wytłumaczę jeszcze raz na czym ma to zadanie polegać:

Chodzi to, aby sprawdzić czy dana liczba jest podzielna rzez 3 bez użycia "n%3==0". Liczby trzeba zsumować i sprawdzić czy ta suma będzie równa 3, 6 lub 9. Jeżeli suma będzie większa od 9, np. 15, to te liczby trzeba ponownie dodać, aby powstała liczba jednocyfrowa.
Teraz moje pytanie brzmi : Jak zmienić ASCII na znak?

1
komentarz 1 listopada 2016 przez criss Mędrzec (172,590 p.)
Ok, teraz wszystko rozumiem.

char to typ przechowujacy liczby całkowite tyle że jest 8-bitowy. Także można na nim wykonywać takie same operacje arytmetyczne jak na innych typach liczbowych. Rzuć teraz okiem na tablicę znaków ASCII. Załóżmy że masz char przechowujacy znak cyfry 0. Jeśli odejmiesz od niego wartość '0' (tzn 48) - dostaniesz 0. Jeśli od '7' odejmiesz 48 to dostaniesz 7. itd
komentarz 1 listopada 2016 przez Ciri Gaduła (3,380 p.)

Już rozumiem. Wielkie dzięki za pomoc. Dużo już mi pomogłeś ;)

Program działa, ale jedynie jeżeli sumą są liczby jedno cyfrowe.

Teraz mam problem z tym

 Jeżeli suma będzie większa od 9, np. 15, to te liczby trzeba ponownie dodać, aby powstała liczba jednocyfrowa. 

Trzeba znowu zrobić w kodzie coś na miarę tego?

	
	cin.getline(liczba,max); 	
	int dl=strlen(liczba);	// Ilość cyfr w liczbie
	
	for(i=0; i<dl; i++)
	{
		cout<<liczba[i]<<" ";	// wyświetlenie znaku z odstępem
		suma=suma+liczba[i];	// Suma znaków w ASCII
		
	}

 

Czy jest jeszcze jakieś inne wyjście z tej sytuacji? :/

1
komentarz 1 listopada 2016 przez criss Mędrzec (172,590 p.)
zrób to w pętli do  {  } while(suma > 9)
komentarz 1 listopada 2016 przez Ciri Gaduła (3,380 p.)

Mój kod wygląda następująco

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
	
	//Program sprawdzający, czy liczba jest podzielna przez 3, bez użycia "n%3==0"
	
	#define max 20
	int i,wynik;
	char pomoc[max];
	char liczba[max];
	int suma=0,sumas=0;
	
	
	cout<<"Podaj liczbe : ";
	cin.getline(liczba,max); 	
	int dl=strlen(liczba);	// Ilość cyfr w liczbie
	
	cout<<"Dlugosc : "<<dl<<endl<<endl;	//Wyświetlenie długości napisu
	

	for(i=0; i<dl; i++)
	{
		cout<<liczba[i]<<" ";	// wyświetlenie znaku z odstępem
		suma=suma+liczba[i];	// Suma znaków w ASCII
		
	}


	wynik=suma-48*dl;		//Odejmowanie 48 w zależności od tego ilu cyfrowa jest liczba
	

	
	if(wynik>9)		//Jeżeli suma jest >9
	{
		do
		{
			wynik-3;	
		}
		while(wynik<=9);
	}
	
	cout<<endl<<endl<<"Suma = "<<wynik<<endl<<endl;

	
	
	
	if(	wynik==3 || 	wynik==6 || 	wynik==9)
	cout<<"Liczba jest podzielna przez 3";
	else
	cout<<"Liczba nie jest podzielna przez 3";
}

Jakoś mi nie działa z tym do...while :/ Próbowałam również z tablicami, ale to nic nie dawało... Mógłbyś mi z tym pomóc? :/ :)

1
komentarz 1 listopada 2016 przez criss Mędrzec (172,590 p.)
    for(i=0; i<dl; i++)
    {
        cout<<liczba[i]<<" ";   // wyświetlenie znaku z odstępem
        suma=suma+liczba[i];    // Suma znaków w ASCII
         
    }
 
 
    wynik=suma-48*dl;

Czemu nie, ale krócej (i automatycznie nie potzrebujesz zmiennej wynik): 

    for(i=0; i<dl; i++)
    {
        cout<<liczba[i]<<" ";   // wyświetlenie znaku z odstępem
        suma += liczba[i] - 48;  // Suma cyfr
    }

Kolejna sprawa. To nic nie robi. Tzn. oblicza wynik - 3, ale nigdzie nie zapisuje wyniku.

wynik-3;

Jeśli chcesz odjąć coś od zmiennej, to:

wynik -= 3;

W pętli popraw warunek : 

    if(wynik>9)      //Jeżeli suma jest >9
    {
        do
        {
            wynik -= 3;    
        }
        while(wynik > 9);
    }

Tyle, że skoro już tak chcesz to robić, to automatycznie sumowanie cyfr przestaje mieć sens, bo przecież coś takiego możesz zastosować też dla tej "oryginalnej", wpisanej liczby :P 

I w zasadzie w ogóle można użyć while zamiast dziwnej kombinacji ifa i do...while. Jak pisałem o do...while, to chodziło mi o co innego, ale nieważne. Troche tego nie przemyślałem i to jednak nie jest taki dobry pomysł.

while(wynik > 9)
   wynik -= 3;

 

komentarz 1 listopada 2016 przez Ciri Gaduła (3,380 p.)

Tak właściwe ten kod mógłby być dużo krótszy i mniej skomplikowany :P

#include <iostream>
using namespace std;
int main()
{

	//Program sprawdzający, czy liczba jest podzielna przez 3, bez użycia "n%3==0"
	
	int liczba;	
	
	cout<<"Podaj liczbe : ";
	cin>>liczba;
	
	while(liczba > 9)  //Odejmowanie od liczby 3
   	liczba -= 3;

	
	cout<<endl;
	if(	liczba==3 || 	liczba==6 || 	liczba==9)
	cout<<"Liczba jest podzielna przez 3";
	else
	cout<<"Liczba nie jest podzielna przez 3";
}

 

komentarz 1 listopada 2016 przez criss Mędrzec (172,590 p.)

Dokładnie, to miałem na myśli przez

Tyle, że skoro już tak chcesz to robić, to automatycznie sumowanie cyfr przestaje mieć sens

Podobne pytania

0 głosów
2 odpowiedzi 8,682 wizyt
pytanie zadane 7 września 2018 w JavaScript przez FroGiS Użytkownik (810 p.)
0 głosów
2 odpowiedzi 359 wizyt
pytanie zadane 17 lipca 2022 w PHP przez Piotrek2713 Mądrala (5,400 p.)
0 głosów
0 odpowiedzi 1,040 wizyt

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...