<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo para Algoritmos - Bóson Treinamentos em Ciência e Tecnologia</title>
	<atom:link href="https://www.bosontreinamentos.com.br/tag/algoritmos/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bosontreinamentos.com.br/tag/algoritmos/</link>
	<description>Artigos e Tutoriais sobre Desenvolvimento de Software, Bancos de Dados SQL, Linux, Lógica de Programação, Inteligência Artificial, Hardware, Eletrônica, Arduino, Técnicas e Teorias de Estudo e Aprendizagem, Carreira em TI, Ciências Cognitivas, e muito mais!</description>
	<lastBuildDate>Wed, 09 Jul 2025 10:47:32 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.6</generator>
	<item>
		<title>Calcular números primos com Crivo de Eratóstenes em Fortran</title>
		<link>https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/</link>
					<comments>https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Tue, 18 Mar 2025 18:13:19 +0000</pubDate>
				<category><![CDATA[Fortran]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[FORTRAN]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19783</guid>

					<description><![CDATA[<p>Números primos com Crivo de Eratóstenes em Fortran Neste tutorial trago um algoritmo simples, escrito em Fortran, que permite encontrar os números primos de 1 até um valor n, informado pelo usuário durante a execução do programa, para isso usando o algoritmo clássico conhecido como Crivo de Eratóstenes. Números primos são números naturais maiores que 1 que têm apenas dois divisores: 1 e eles mesmos. Em outras palavras, são números que não podem ser divididos por nenhum outro número além de 1 e deles mesmos sem resultar em um resto. Exemplos de números primos incluem 2, 3, 5, 7 e 11. A propriedade fundamental dos números primos é que não podem ser formados multiplicando dois números inteiros diferentes entre si. A compreensão dos números primos é crucial em matemática, e sua identificação desempenha um papel fundamental em áreas como criptografia e teoria dos números. O Crivo de Eratóstenes é um algoritmo antigo e eficiente para encontrar todos os números primos até um determinado limite. Ele funciona marcando os múltiplos de cada número primo encontrado, eliminando números compostos e deixando apenas os números primos. O algoritmo realiza iterações até que todos os números até o limite desejado sejam verificados. Trata-se de [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/">Calcular números primos com Crivo de Eratóstenes em Fortran</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Números primos com Crivo de Eratóstenes em Fortran</h2>
<p>Neste tutorial trago um algoritmo simples, escrito em Fortran, que permite encontrar os números primos de 1 até um valor n, informado pelo usuário durante a execução do programa, para isso usando o algoritmo clássico conhecido como <strong><em>Crivo de Eratóstenes</em></strong>.</p>
<p>Números primos são números naturais maiores que 1 que têm apenas dois divisores: 1 e eles mesmos. Em outras palavras, são números que não podem ser divididos por nenhum outro número além de 1 e deles mesmos sem resultar em um resto.</p>
<p>Exemplos de números primos incluem 2, 3, 5, 7 e 11.</p>
<p>A propriedade fundamental dos números primos é que não podem ser formados multiplicando dois números inteiros diferentes entre si. A compreensão dos números primos é crucial em matemática, e sua identificação desempenha um papel fundamental em áreas como criptografia e teoria dos números.</p>
<p>O <a href="https://www.keil.com/benchmarks/sieve.asp" target="_blank" rel="noopener">Crivo de Eratóstenes</a> é um algoritmo antigo e eficiente para encontrar todos os números primos até um determinado limite. Ele funciona marcando os múltiplos de cada número primo encontrado, eliminando números compostos e deixando apenas os números primos. O algoritmo realiza iterações até que todos os números até o limite desejado sejam verificados.</p>
<p>Trata-se de uma maneira bastante eficaz de encontrar rapidamente todos os números primos dentro de um intervalo específico.</p>
<p>De acordo com a tradição, o Crivo de Eratóstenes foi criado pelo matemático grego Eratóstenes de Cirene por volta de 240 a.C., sendo assim uma das técnicas mais antigas conhecidas para encontrar números primos.</p>
<div id="attachment_19891" style="width: 279px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-19891" class="size-full wp-image-19891" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/eratostenes-busto.png" alt="Busto de Eratóstenes" width="269" height="437" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/eratostenes-busto.png 269w, https://www.bosontreinamentos.com.br/wp-content/uploads/2024/01/eratostenes-busto-259x420.png 259w" sizes="(max-width: 269px) 100vw, 269px" /><p id="caption-attachment-19891" class="wp-caption-text">Busto de Eratóstenes</p></div>
<p>Neste tutorial vamos implementar este algoritmo usando a linguagem de programação Fortran.</p>
<h3>Funcionamento do Crivo de Eratóstenes</h3>
<p>O algoritmo do Crivo de Eratóstenes funciona da seguinte maneira:</p>
<ol>
<li>Inicialização:<br />
Começamos criando uma lista de números a partir de 2 até o valor limite desejado pelo usuário.<br />
Marcamos todos esses números como não riscados, indicando que inicialmente consideramos todos como primos.</li>
<li>Seleção do Próximo Número:<br />
Começamos com o primeiro número não riscado, que é o 2.<br />
Este número é então marcado como primo, já que é o menor número não riscado (e 2 é o primeiro número primo).</li>
<li>Eliminação dos Múltiplos:<br />
Agora vamos riscar todos os múltiplos do número primo que acabamos de encontrar, até chegar no valor limite.<br />
No caso, riscamos todos os múltiplos de 2 (4, 6, 8, 10, 12, &#8230;).</li>
<li>Seleção do Próximo Número Não Riscado:<br />
Após riscar os múltiplos do número anterior, vamos nos mover para o próximo número não riscado na lista, que é o próximo número primo.</li>
<li>Repetição:<br />
Repetimos os passos 3 e 4 até que tenhamos marcado todos os números não riscados como primos ou não primos.</li>
</ol>
<p>Ao final do processo, os números que permanecem não riscados são os números primos dentro do intervalo desejado. O Crivo de Eratóstenes é eficiente porque evita a verificação de múltiplos de números que já foram marcados como não primos, reduzindo significativamente o número de iterações necessárias.</p>
<p>Visualmente, o que o crivo de Eratóstenes equivale ao seguinte:</p>
<table class="dataframe" border="1">
<thead>
<tr style="text-align: right;">
<th> </th>
<th>0</th>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 5</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 6</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 7</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 8</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 9</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 10</td>
</tr>
<tr>
<th>1</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 11</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 12</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 13</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 14</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 15</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 16</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 17</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 18</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 19</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 20</td>
</tr>
<tr>
<th>2</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 21</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 22</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 23</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 24</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 25</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 26</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 27</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 28</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 29</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 30</td>
</tr>
<tr>
<th>3</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 31</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 32</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 33</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 34</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 35</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 36</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 37</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 38</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 39</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 40</td>
</tr>
<tr>
<th>4</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 41</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 42</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 43</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 44</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 45</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 46</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 47</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 48</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 49</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 50</td>
</tr>
<tr>
<th>5</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 51</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 52</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 53</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 54</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 55</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 56</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 57</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 58</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 59</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 60</td>
</tr>
<tr>
<th>6</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 61</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 62</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 63</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 64</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 65</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 66</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 67</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 68</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 69</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 70</td>
</tr>
<tr>
<th>7</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 71</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 72</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 73</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 74</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 75</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 76</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 77</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 78</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 79</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 80</td>
</tr>
<tr>
<th>8</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 81</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 82</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 83</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 84</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 85</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 86</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 87</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 88</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 89</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 90</td>
</tr>
<tr>
<th>9</th>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 91</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 92</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 93</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 94</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 95</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 96</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 97</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 98</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 99</td>
<td><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 100</td>
</tr>
</tbody>
</table>
<p>Podemos ver que os números primos estão destacados (check verde), ao passo que os números múltiplos, que não são primos, são descartados (x vermelho).</p>
<p>Este algoritmo é bastante empregado em matemática computacional e é uma abordagem clássica para encontrar números primos.</p>
<p>Vejamos agora como implementar esse algoritmo usando uma linguagem de programação &#8211; no caso, o Fortran.</p>
<h3>Código em Fortran</h3>
<pre>program CrivoDeEratostenes
implicit none

integer, parameter :: MAX_N = 1000000
integer :: n
logical :: e_primo(MAX_N)
integer :: i, j

<span style="color: #339966;">! Inicializar o vetor de primos como verdadeiro</span>
e_primo = .true.

<span style="color: #339966;">! Solicitar ao usuário que insira o valor de 'n'</span>
write(*,*) 'Digite um número inteiro positivo n:'
read(*,*) n

<span style="color: #339966;">! Verificar se o valor de n está dentro dos limites permitidos para números primos</span>
if (n &lt;= 1 .or. n &gt; MAX_N) then
    write(*,*) 'Valor de n fora dos limites permitidos.'
    stop
end if

<span style="color: #339966;">! Algoritmo do Crivo de Eratóstenes</span>
do i = 2, n
    if (e_primo(i)) then
        do j = 2*i, n, i
            e_primo(j) = .false.
        end do
    end if
end do

! Exibir os números primos encontrados
write(*,*) 'Números primos de 1 até', n, ':'
do i = 2, n
    if (e_primo(i)) then
        write(*,*) i
    end if
end do

end program CrivoDeEratostenes</pre>
<h3>Teste</h3>
<p>Para testar, vamos pedir ao programa para retornar todos os números primos até o valor 500.000 (quinhentos mil!):</p>
<p>Resultado (truncado):</p>
<pre><span style="color: #000000;"><strong>2</strong></span>
<span style="color: #000000;"><strong>3</strong></span>
<span style="color: #000000;"><strong>5</strong></span>
<span style="color: #000000;"><strong>7</strong></span>
<span style="color: #000000;"><strong>11</strong></span>
<span style="color: #000000;"><strong>...</strong></span>
<span style="color: #000000;"><strong>499943</strong></span>
<span style="color: #000000;"><strong>499957</strong></span>
<span style="color: #000000;"><strong>499969</strong></span>
<span style="color: #000000;"><strong>499973</strong></span>
<span style="color: #000000;"><strong>499979</strong></span></pre>
<h3>Explicação do Código</h3>
<p>E como exatamente funciona esse código? Vejamos uma explicação passo a passo:</p>
<p>1. Declaração de Variáveis &#8211; Começamos declarando algumas variáveis:</p>
<ul>
<li><strong>MAX_N</strong>: Valor máximo permitido para n (limite superior para encontrar números primos).</li>
<li><strong>n</strong>: Número que será fornecido pelo usuário.</li>
<li><strong>e_primo</strong>: Um array lógico que indica se um número <em>é primo</em> (TRUE) ou não (FALSE).</li>
<li><strong>i</strong> e <strong>j</strong>: Índices para iteração.</li>
</ul>
<p>2. Inicialização:</p>
<ul>
<li>e_primo = .TRUE.: Inicializa o vetor de primos como verdadeiro.</li>
</ul>
<p>3. Entrada do Usuário:</p>
<ul>
<li>write(*,*) &#8216;Digite um número inteiro positivo n:&#8217;: Solicita ao usuário que insira um número inteiro positivo.</li>
<li>read(*,*) n: Lê o valor inserido pelo usuário.</li>
</ul>
<p>4. Verificação do Limite:<br />
&#8211; if (n &lt;= 1 .or. n &gt; MAX_N) then: Verifica se o valor de n está dentro dos limites permitidos para números primos.<br />
&#8211; write(*,*) &#8216;Valor de n fora dos limites permitidos.&#8217;: Exibe uma mensagem de erro se o valor de n estiver fora dos limites.<br />
&#8211; stop: Encerra o programa.</p>
<p>5. Algoritmo do Crivo de Eratóstenes:<br />
&#8211; A estrutura de repetição do i = 2, n itera sobre todos os números de 2 até n.<br />
&#8211; if (e_primo(i)) then: Verifica se i é marcado como primo.<br />
&#8211; A estrutura de repetição interna do j = 2*i, n, i marca todos os múltiplos de i como não primos, já que eles são divisíveis por i.</p>
<p>6. Saída dos Números Primos Encontrados:<br />
&#8211; write(*,*) &#8216;Números primos de 1 até&#8217;, n, &#8216;:&#8217;: Exibe uma mensagem indicando que os números primos estão sendo mostrados.<br />
&#8211; A segunda estrutura de repetição do i = 2, n itera sobre todos os números de 2 até n.<br />
&#8211; if (e_primo(i)) then: Verifica se i é marcado como primo.<br />
&#8211; write(*,*) i: Exibe o número primo.</p>
<h3>Conclusão</h3>
<p>Neste artigo vimos como empregar a técnica do Crivo de Eratóstenes para determinar números primos na linguagem de programação Fortran. Esse mesmo código pode ser adaptado para outras linguagens, como Python, C++, C# ou Rust, de acordo com sua necessidade.</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/">Calcular números primos com Crivo de Eratóstenes em Fortran</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/fortran/calcular-numeros-primos-com-crivo-de-eratostenes-em-fortran/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Descobrir número que falta em lista de 1000 números sequenciais em Python</title>
		<link>https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/</link>
					<comments>https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Thu, 24 Oct 2024 11:14:17 +0000</pubDate>
				<category><![CDATA[Programação em Python]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.bosontreinamentos.com.br/?p=20361</guid>

					<description><![CDATA[<p>Descobrir número que falta em lista de 1000 números sequenciais em Python Neste tutorial vamos escrever um pequeno programa em linguagem Python que irá gerar uma lista com os números de 1 até 1000 (sequenciais), colocados depois em ordem aleatória, e então retirar um único número dessa lista, de forma aleatória também (não sabemos qual será o número retirado). Na sequência, o programa executará uma função que varre essa lista e descobre qual o número que está faltando, informando-o ao usuário. Qual o nosso objetivo com esse script? Estudar e praticar técnicas de programação. No caso iremos trabalhar com geração de números aleatórios, embaralhamento de listas, definição de funções e aplicação de lógica para resolver problemas. Abaixo temos o código usado, e na sequência a explicação detalhada de seu funcionamento. Fique à vontade para alterar o código a seu gosto, modificando ou acrescentando funcionalidades ao script. Código em Python import random # Função para encontrar o número que está faltando def encontrar_numero_faltando(lista):    # A soma esperada dos números de 1 a 1000    soma_esperada = sum(range(1, 1001))    # A soma dos números na lista com um número faltando    soma_lista = sum(lista)    # O número que está faltando será a diferença entre [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/">Descobrir número que falta em lista de 1000 números sequenciais em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Descobrir número que falta em lista de 1000 números sequenciais em Python</h1>
<p><span style="font-weight: 400;">Neste tutorial vamos escrever um pequeno programa em <a href="https://www.bosontreinamentos.com.br/programacao-com-python/">linguagem Python</a> que irá gerar uma lista com os números de 1 até 1000 (sequenciais), colocados depois em ordem aleatória, e então retirar um único número dessa lista, de forma aleatória também (não sabemos qual será o número retirado).</span></p>
<p><span style="font-weight: 400;">Na sequência, o programa executará uma função que varre essa lista e descobre qual o número que está faltando, informando-o ao usuário.</span></p>
<p>Qual o nosso objetivo com esse script? Estudar e praticar técnicas de programação. No caso iremos trabalhar com geração de números aleatórios, embaralhamento de listas, <a href="https://www.bosontreinamentos.com.br/programacao-em-python/funcoes-em-python-introducao/">definição de funções</a> e aplicação de lógica para resolver problemas.</p>
<p>Abaixo temos o código usado, e na sequência a explicação detalhada de seu funcionamento. Fique à vontade para alterar o código a seu gosto, modificando ou acrescentando funcionalidades ao script.</p>
<h2>Código em Python</h2>
<pre><strong>import random

</strong><span style="color: #339966;"><strong># Função para encontrar o número que está faltando
</strong></span><strong>def encontrar_numero_faltando(lista):</strong>
<strong>   <span style="color: #339966;"> # A soma esperada dos números de 1 a 1000</span></strong>
<strong>    soma_esperada = sum(range(1, 1001))</strong>
<strong>    <span style="color: #339966;"># A soma dos números na lista com um número faltando</span></strong>
<strong>    soma_lista = sum(lista)</strong>
<strong>    <span style="color: #339966;"># O número que está faltando será a diferença entre a soma esperada e a soma da lista</span></strong>
<strong>    return soma_esperada - soma_lista

</strong><span style="color: #339966;"><strong># Gerar uma lista de 1 a 1000</strong></span>
<strong>lista_numeros = list(range(1, 1001))

</strong><span style="color: #339966;"><strong># Embaralhar a lista de forma aleatória</strong></span>
<strong>random.shuffle(lista_numeros)

</strong><span style="color: #339966;"><strong># Remove um número aleatório da lista</strong></span>
<strong>numero_removido = random.choice(lista_numeros)</strong>
<strong>lista_numeros.remove(numero_removido)

</strong><span style="color: #339966;"><strong># Mostrar a lista</strong></span>
<strong>print(f'Lista de números: \n{lista_numeros}')

</strong><span style="color: #339966;"><strong># Encontrar o número faltando e exibir para o usuário</strong></span>
<strong>numero_faltando = encontrar_numero_faltando(lista_numeros)</strong>
<strong>print(f'\nO número faltando é: {numero_faltando}')</strong></pre>
<h2><strong>Como funciona esse script</strong></h2>
<p>Inicialmente, importamos o <a href="https://www.bosontreinamentos.com.br/programacao-em-python/7-2-python-geracao-de-numeros-aleatorios-e-modulo-random/">módulo <strong>random</strong></a>, que será necessário para a geração e manipulação dos números aleatórios (na verdade, <a href="https://docs.python.org/pt-br/3/library/random.html" target="_blank" rel="noopener">pseudoaleatórios</a>) que necessitaremos.</p>
<p>Na sequência, definimos a função &#8220;<em>encontrar_numero_faltando</em>&#8220;, que recebe como argumento a lista de números que será analisada.</p>
<p>Para determinar o número que está ausente nesta lista (haverá apenas um único número ausente dentre os mil valores), podemos aplicar várias técnicas. Aqui, iremos calcular a soma dos números de 1 até 1000 (armazenada na variável <em>soma_esperada</em>), e na sequência somaremos todos os números da lista passada à função, armazenado esse valor na variável <em>soma_lista</em>.</p>
<p>Então, basta subtrair da soma_esperada o valor de soma_lista, e o resultado será o número que falta (ausente). A função então retorna esse valor.</p>
<p>Fora da função, geramos uma lista de 1 até 1000 usando a <a href="https://www.bosontreinamentos.com.br/programacao-em-python/12-python-listas-01-criacao-insercao-e-alteracao-de-itens-metodo-append-e-outros/">função <strong>list()</strong></a> combinada com a <a href="https://www.bosontreinamentos.com.br/programacao-em-python/20-python-loop-for-estruturas-de-repeticao-funcao-range/">função <strong>range</strong></a>, embaralhamos os números com o método <strong>random.shuffle</strong>, e retiramos um número da lista com os métodos <strong>random.choice</strong> (escolhe o número) e <strong>lista_numeros.remove</strong> (remove esse número da lista).</p>
<p>Na sequência, exibimos a lista na tela com a <a href="https://www.bosontreinamentos.com.br/programacao-em-python/guia-basico-da-funcao-print-em-python/">função <strong>print</strong></a>, e finalmente encontramos o número faltante chamando a função criada <em>encontrar_numero_faltando</em>, exibindo no final seu valor para o usuário.</p>
<p>Note que cada vez que o script for executado, um número diferente será sacado da lista, pois a escolha do valor a ser retirado pelo método <strong>choice</strong> é aleatória.</p>
<h3>Conclusão</h3>
<p>Com este pequeno script pudemos treinar o emprego e manipulação de números aleatórios, além da criação de funções e da aplicação de raciocínio lógico para a resolução de problemas com programação.</p>
<p>Você pode alterar o algoritmo para, por exemplo, gerar mais de 1000 números (que tal 1 milhão de valores?) e rodá-lo para testar sua performance e verificar sua utilidade. Será que ele ainda roda de forma satisfatória?</p>
<p>Você também pode tentar portar esse script para outras linguagens de programação que prefira, como por exemplo <a href="https://www.bosontreinamentos.com.br/category/programacao-em-javascript/">JavaScript</a>, <a href="https://www.bosontreinamentos.com.br/category/csharp/">C#</a> ou <a href="https://www.bosontreinamentos.com.br/category/rust/">Rust</a>, para treinar abordagens ligeiramente diferentes de codificação.</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/">Descobrir número que falta em lista de 1000 números sequenciais em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/programacao-em-python/descobrir-numero-que-falta-em-lista-de-1000-numeros-sequenciais-em-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como gerar números primos em Python em um intervalo especificado</title>
		<link>https://www.bosontreinamentos.com.br/programacao-em-python/como-gerar-numeros-primos-em-python-em-um-intervalo-especificado/</link>
					<comments>https://www.bosontreinamentos.com.br/programacao-em-python/como-gerar-numeros-primos-em-python-em-um-intervalo-especificado/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Mon, 14 Aug 2023 11:49:39 +0000</pubDate>
				<category><![CDATA[Programação em Python]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19616</guid>

					<description><![CDATA[<p>Gerar números primos em Python em um intervalo especificado Exercício: Escreva um programa em Python que retorne uma lista de números primos compreendidos em um intervalo fornecido pelo usuário (incluindo os extremos). Use funções para tal. Por exemplo, ao executar o script se o usuário solicitar a lista de primos entre 7 e 50, o programa deve retornar um resultado como segue: Entre com o menor valor: 7 Entre com o maior valor: 50 Os números primos no intervalo de 7 a 50 são: 7 11 13 17 19 23 29 31 37 41 43 47 Vejamos o código que permite gerar números primos em Python. Código # Como gerar números primos em um intervalo numérico # Função para verificar os números primos def primo(n): if n &#60; 2: return False for i in range(2, int(n/2)+1): if n % i == 0: return False return True if __name__=='__main__': # Usuário escolhe o intervalo inf = int(input('Entre com o menor valor: ')) sup = int(input('Entre com o maior valor: ')) print('Os primos no intervalo de {} a {} são:'.format(inf, sup)) for i in range(inf, sup + 1): if primo(i): print(i, end=' ') Funcionamento do script Vou dividir a explicação em duas [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/como-gerar-numeros-primos-em-python-em-um-intervalo-especificado/">Como gerar números primos em Python em um intervalo especificado</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Gerar números primos em Python em um intervalo especificado</h2>
<p><em>Exercício: Escreva um programa em Python que retorne uma lista de números primos compreendidos em um intervalo fornecido pelo usuário (incluindo os extremos). Use funções para tal.</em></p>
<p>Por exemplo, ao executar o script se o usuário solicitar a lista de primos entre 7 e 50, o programa deve retornar um resultado como segue:</p>
<pre><span style="color: #000000; font-size: 14pt;">Entre com o menor valor: </span>
<span style="color: #000000; font-size: 14pt;">7</span>
<span style="color: #000000; font-size: 14pt;">Entre com o maior valor: </span>
<span style="color: #000000; font-size: 14pt;">50</span>
<span style="color: #000000; font-size: 14pt;">Os números primos no intervalo de 7 a 50 são:</span>
<span style="color: #000000; font-size: 14pt;">7 11 13 17 19 23 29 31 37 41 43 47 </span></pre>
<p>Vejamos o código que permite gerar números primos em Python.</p>
<h3>Código</h3>
<pre><span style="color: #339966;"><strong># Como gerar números primos em um intervalo numérico</strong></span>
<span style="color: #339966;"><strong># Função para verificar os números primos</strong></span>
<strong>def primo(n):</strong>
<strong>    if n &lt; 2:</strong>
<strong>        return False</strong>
<strong>    for i in range(2, int(n/2)+1):</strong>
<strong>        if n % i == 0:</strong>
<strong>            return False</strong>
<strong>    return True

</strong><strong>if __name__=='__main__':</strong>
<span style="color: #339966;"><strong>    # Usuário escolhe o intervalo</strong></span>
<strong>    inf = int(input('Entre com o menor valor: '))</strong>
<strong>    sup = int(input('Entre com o maior valor: '))

</strong><strong>    print('Os primos no intervalo de {} a {} são:'.format(inf, sup))

</strong><strong>    for i in range(inf, sup + 1):</strong>
<strong>        if primo(i):</strong>
<strong>            print(i, end=' ')</strong></pre>
<h3>Funcionamento do script</h3>
<p>Vou dividir a explicação em duas partes: a função primo e o bloco principal do programa.</p>
<h4>Função primo(n)</h4>
<p>A função <em><strong>primo(n)</strong></em> é definida para verificar se um número n é primo ou não. Ela funciona da seguinte maneira:</p>
<ol>
<li>Verifica se um valor n passado como parâmetro é menor que 2. Se for, retorna False, pois números menores que 2 não são primos.</li>
<li>Se n não for menor do que 2, a função inicia um loop que percorre os valores de i de 2 até n/2 + 1 (metade +1 do valor informado).</li>
<li>Para cada valor de i, verifica se n é divisível por i (ou seja, se n % i == 0). Se essa condição for verdadeira, significa que n não é primo, pois possui um divisor além de 1 e ele mesmo. Portanto, a função retorna False.</li>
<li>Caso nenhum valor de i resulte em uma divisão exata de n, a função retorna True, indicando que n é um número primo.</li>
</ol>
<h4>Bloco if __name__==&#8217;__main__&#8217;:</h4>
<p>No bloco principal, o programa realiza as seguintes ações:</p>
<ol>
<li>Solicita que o usuário insira o valor mínimo (inf) e o valor máximo (sup) do intervalo a gerar.</li>
<li>Exibe uma mensagem informando que os números primos no intervalo de inf a sup serão exibidos na sequência.</li>
<li>Usando um laço for, percorre todos os valores de i no intervalo de inf a sup + 1.</li>
<li>Para cada valor de i, chama a função primo(i) para verificar se i é um número primo.</li>
<li>Se i for primo (ou seja, se a função primo(i) retornar True), o valor de i é impresso na mesma linha, seguido de um espaço. Isso ocorre para todos os números primos encontrados no intervalo.</li>
</ol>
<p>Portanto, o programa vai iterar por todos os números no intervalo especificado pelo usuário, verificar se cada número é primo usando a função primo(n), e imprimir os números primos encontrados.</p>
<p>Veja que essa implementação é funcional, porém não é a mais eficiente em termos de tempo de execução para encontrar números primos, especialmente para intervalos maiores, pois realiza uma divisão para cada número no intervalo.</p>
<p>Existem algoritmos mais eficientes para geração de números primos, como o <a href="https://pt.wikipedia.org/wiki/Crivo_de_Eratóstenes" target="_blank" rel="noopener">Crivo de Eratóstenes</a> .</p>
<p>&nbsp;</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/como-gerar-numeros-primos-em-python-em-um-intervalo-especificado/">Como gerar números primos em Python em um intervalo especificado</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/programacao-em-python/como-gerar-numeros-primos-em-python-em-um-intervalo-especificado/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Algoritmo Torre de Hanoi em Python</title>
		<link>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-torre-de-hanoi-em-python/</link>
					<comments>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-torre-de-hanoi-em-python/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Mon, 24 Jul 2023 14:39:37 +0000</pubDate>
				<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19554</guid>

					<description><![CDATA[<p>Torre de Hanoi A Torre de Hanoi é um famoso quebra-cabeça ou problema matemático, inventado pelo matemático francês François Édouard Anatole Lucas no século XIX, que consiste em mover uma pilha de discos de tamanhos diferentes de uma haste de origem para uma haste de destino, usando uma haste intermediária. A regra básica é que um disco maior nunca pode ficar em cima de um disco menor. Torre de Hanoi com sete discos e três hastes A configuração inicial consiste em três hastes (podemos chamá-las de A, B e C) e uma pilha de discos de tamanhos diferentes posicionados em ordem decrescente em uma das hastes (geralmente a haste A). O objetivo é mover todos os discos da haste A para a haste C, utilizando a haste B como intermediária, seguindo as seguintes regras: 1. Apenas um disco pode ser movido por vez. 2. Um disco só pode ser movido se estiver no topo da pilha em sua haste atual. 3. Um disco maior nunca pode ficar em cima de um disco menor. O desafio é encontrar a sequência correta de movimentos para transferir todos os discos da haste A para a haste C. A solução ótima para a Torre [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-torre-de-hanoi-em-python/">Algoritmo Torre de Hanoi em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Torre de Hanoi</h2>
<p>A <strong>Torre de Hanoi</strong> é um famoso quebra-cabeça ou problema matemático, inventado pelo matemático francês François Édouard Anatole Lucas no século XIX, que consiste em mover uma pilha de discos de tamanhos diferentes de uma haste de origem para uma haste de destino, usando uma haste intermediária. A regra básica é que um disco maior nunca pode ficar em cima de um disco menor.</p>
<div id="attachment_19573" style="width: 610px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-19573" class="wp-image-19573" title="Torre de Hanoi com sete discos" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-de-hanoi-boson-treinamentos.jpg" alt="Torre de Hanoi com sete discos" width="600" height="338" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-de-hanoi-boson-treinamentos.jpg 952w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-de-hanoi-boson-treinamentos-420x236.jpg 420w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-de-hanoi-boson-treinamentos-768x432.jpg 768w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-de-hanoi-boson-treinamentos-580x326.jpg 580w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-de-hanoi-boson-treinamentos-174x98.jpg 174w" sizes="auto, (max-width: 600px) 100vw, 600px" /><p id="caption-attachment-19573" class="wp-caption-text">Torre de Hanoi com sete discos e três hastes</p></div>
<p>A configuração inicial consiste em três hastes (podemos chamá-las de A, B e C) e uma pilha de discos de tamanhos diferentes posicionados em ordem decrescente em uma das hastes (geralmente a haste A). O objetivo é mover todos os discos da haste A para a haste C, utilizando a haste B como intermediária, seguindo as seguintes regras:</p>
<p>1. Apenas um disco pode ser movido por vez.<br />
2. Um disco só pode ser movido se estiver no topo da pilha em sua haste atual.<br />
3. Um disco maior nunca pode ficar em cima de um disco menor.</p>
<p>O desafio é encontrar a sequência correta de movimentos para transferir todos os discos da haste A para a haste C. A solução ótima para a Torre de Hanoi requer 2<sup>n</sup> &#8211; 1 movimentos, onde n é o número de discos.</p>
<p>Ou seja, com 3 discos é possível resolver a torre em 2<sup>3</sup> &#8211; 1 = 7 movimentos. Já uma torre com 7 discos necessitará de 2<sup>7</sup> &#8211; 1 = 127 movimentos.</p>
<p>A Torre de Hanoi é um problema clássico de recursão e tem aplicações em algoritmos, programação e teoria da computação para ilustrar conceitos como recursão, pilha de chamadas e complexidade algorítmica.</p>
<h3>Algoritmo da Torre de Hanoi</h3>
<p>Vejamos um exemplo de <a href="http://www.bosontreinamentos.com.br/programacao-com-python/">algoritmo em Python</a> que resolve uma Torre de Hanoi, recebendo como entrada do usuário o número de discos desejado. Vamos usar uma <a href="http://www.bosontreinamentos.com.br/logica-de-programacao/o-que-e-recursividade/">abordagem recursiva</a> neste exemplo.</p>
<p>Chamaremos as hastes (torres) de A, B e C para identificação ao chamar a função no programa principal, como mostra a figura a seguir:</p>
<div id="attachment_19607" style="width: 470px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-19607" class="wp-image-19607" title="Hastes das Torres de Hanoi" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-hanoi-hastes.jpg" alt="Hastes das Torres de Hanoi" width="460" height="234" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-hanoi-hastes.jpg 728w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/torre-hanoi-hastes-420x213.jpg 420w" sizes="auto, (max-width: 460px) 100vw, 460px" /><p id="caption-attachment-19607" class="wp-caption-text">Hastes das Torres de Hanoi</p></div>
<p>O objetivo é mover todos os discos da torre A para a torre C. Vamos ao código agora.</p>
<pre><strong>def torre_hanoi(n, origem, destino, auxiliar):</strong>
<strong>    if n == 1:</strong>
<strong>        print(f"Mova o disco 1 de {origem} para {destino}")</strong>
<strong>        return</strong>
<strong>    torre_hanoi(n-1, origem, auxiliar, destino)</strong>
<strong>    print(f"Mova o disco {n} de {origem} para {destino}")</strong>
<strong>    torre_hanoi(n-1, auxiliar, destino, origem)

</strong><span style="color: #008000;"><strong><span style="color: #ff0000;">if __name__=='__main__':</span>
    # Exemplo de uso</strong></span>
<strong>    n = int(input("Digite o número de discos: "))</strong>
<strong>    torre_hanoi(n, "A", "C", "B")</strong></pre>
<p><strong>Testando:</strong></p>
<pre><span style="color: #800000;">Digite o número de discos: </span>
<span style="color: #800000;">3</span>
<span style="color: #800000;">Mova o disco 1 de A para C</span>
<span style="color: #800000;">Mova o disco 2 de A para B</span>
<span style="color: #800000;">Mova o disco 1 de C para B</span>
<span style="color: #800000;">Mova o disco 3 de A para C</span>
<span style="color: #800000;">Mova o disco 1 de B para A</span>
<span style="color: #800000;">Mova o disco 2 de B para C</span>
<span style="color: #800000;">Mova o disco 1 de A para C</span></pre>
<h4>Funcionamento</h4>
<p>Nesse algoritmo, a função torre_hanoi() recebe quatro parâmetros: o número de discos n, a torre de origem origem, a torre de destino destino e a torre auxiliar auxiliar. A função utiliza a recursão para resolver o problema da Torre de Hanoi.</p>
<p>Quando há apenas um disco, ele é movido diretamente da torre de origem para a torre de destino. Caso contrário, a função chama recursivamente a si mesma para mover n-1 discos da torre de origem para a torre auxiliar, em seguida move o disco restante da torre de origem para a torre de destino e, por fim, move os n-1 discos da torre auxiliar para a torre de destino.</p>
<p>O algoritmo exibe as instruções para mover cada disco, indicando de qual torre para qual torre ele deve ser movido. Basta executar o algoritmo informando o número de discos desejado para ver a solução para a Torre de Hanoi.</p>
<h3>Modificação do algoritmo</h3>
<p>Vamos modificar o algoritmo anterior para que ele mostre também o número de movimentos realizados para resolver a torre:</p>
<pre><strong>def torre_hanoi(n, origem, destino, auxiliar):</strong>
<strong>    if n == 1:</strong>
<strong>        print(f"Mova o disco 1 de {origem} para {destino}")</strong>
<strong>    return 1</strong>
<strong>    movimentos = torre_hanoi(n-1, origem, auxiliar, destino)</strong>
<strong>    print(f"Mova o disco {n} de {origem} para {destino}")</strong>
<strong>    movimentos += 1</strong>
<strong>    movimentos += torre_hanoi(n-1, auxiliar, destino, origem)</strong>
<strong>    return movimentos

<span style="color: #008000;"><span style="color: #ff0000;">if __name__=='__main__':</span></span>
</strong><span style="color: #008000;"><strong>    # Exemplo de uso</strong></span>
<strong>    n = int(input("Digite o número de discos: "))</strong>
<strong>    total_movimentos = torre_hanoi(n, "A", "C", "B")</strong>
<strong>    print(f"Total de movimentos realizados: {total_movimentos}")</strong></pre>
<p><strong>Testando:</strong></p>
<pre><span style="color: #800000;">Digite o número de discos: </span>
<span style="color: #800000;">3</span>
<span style="color: #800000;">Mova o disco 1 de A para C</span>
<span style="color: #800000;">Mova o disco 2 de A para B</span>
<span style="color: #800000;">Mova o disco 1 de C para B</span>
<span style="color: #800000;">Mova o disco 3 de A para C</span>
<span style="color: #800000;">Mova o disco 1 de B para A</span>
<span style="color: #800000;">Mova o disco 2 de B para C</span>
<span style="color: #800000;">Mova o disco 1 de A para C</span>
<span style="color: #800000;">Total de movimentos realizados: 7</span></pre>
<h4>Funcionamento</h4>
<p>1. Definimos a função torre_hanoi, que recebe como parâmetros o número de discos n, os nomes das torres origem, destino e auxiliar.</p>
<p>2. Dentro da função, verificamos se n é igual a 1. Se sim, significa que temos apenas um disco a ser movido, então imprimimos a instrução para mover o disco da origem para o destino e retornamos 1, indicando que foi realizado um movimento.</p>
<p>3. Caso contrário, temos mais de um disco. Chamamos recursivamente a função torre_hanoi para mover n-1 discos da origem para a auxiliar, usando o destino como torre auxiliar. Armazenamos o número de movimentos retornados em movimentos.</p>
<p>4. Imprimimos a instrução para mover o disco n da origem para o destino e incrementamos movimentos em 1, já que realizamos mais um movimento.</p>
<p>5. Chamamos novamente recursivamente a função torre_hanoi para mover os n-1 discos restantes da auxiliar para o destino, usando a origem como torre auxiliar. Somamos o número de movimentos retornados ao total de movimentos atual.</p>
<p>6. Retornamos o total de movimentos realizados.</p>
<p>7. No exemplo de uso, solicitamos ao usuário que digite o número de discos desejado.</p>
<p>8. Chamamos a função torre_hanoi passando o número de discos, os nomes das torres &#8220;A&#8221;, &#8220;C&#8221; e &#8220;B&#8221; como argumentos, respectivamente. Armazenamos o total de movimentos retornados em total_movimentos.</p>
<p>9. Por fim, exibimos o total de movimentos realizados na solução.</p>
<h3>Conclusão</h3>
<p>Concluindo, vimos que a Torre de Hanoi é um enigma matemático fascinante que desafia a mente e tem sido objeto de estudo e entretenimento há muito tempo.</p>
<p>Por meio dos exemplos de algoritmos em Python, ficou claro que a solução para o que aparenta ser um quebra-cabeça complexo é surpreendentemente elegante e simples. Com a implementação da função recursiva (pode ser feito de forma iterativa também), pudemos observar uma abordagem para a resolução da Torre de Hanoi, perfeita para o estudo de recursividade em algoritmos e lógica de programação.</p>
<p>Além de ser uma demonstração de habilidades de programação e lógica, o estudo da Torre de Hanoi oferece insights valiosos para a computação e outras áreas da matemática. Como vimos, é um excelente exercício para compreender a recursividade e a otimização de algoritmos.</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-torre-de-hanoi-em-python/">Algoritmo Torre de Hanoi em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-torre-de-hanoi-em-python/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>O que é Recursividade</title>
		<link>https://www.bosontreinamentos.com.br/logica-de-programacao/o-que-e-recursividade/</link>
					<comments>https://www.bosontreinamentos.com.br/logica-de-programacao/o-que-e-recursividade/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Mon, 17 Jul 2023 20:00:21 +0000</pubDate>
				<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19475</guid>

					<description><![CDATA[<p>Recursividade em Lógica de Programação Recursividade (ou Recursão) é um conceito em ciência da computação que se refere à capacidade de uma função ou procedimento chamar a si mesmo de forma direta ou indireta durante a sua execução. Em outras palavras, é quando uma função é definida em termos dela mesma. Ao utilizar a recursividade, uma função pode ser dividida em problemas menores e mais simples, resolvendo-os em etapas sucessivas até alcançar um caso base, que é uma condição que não requer chamadas recursivas e permite a conclusão do processo. A recursividade é frequentemente usada para resolver problemas que podem ser subdivididos em subproblemas do mesmo tipo. Essa abordagem é especialmente útil quando a estrutura do problema é recursiva por natureza. Alguns exemplos de algoritmos recursivos comuns incluem a busca em árvores, a ordenação rápida (quicksort) e o cálculo do fatorial. Uma função recursiva geralmente possui dois componentes principais: Caso base: É uma condição especial que determina quando a recursão deve parar. Quando a condição do caso base é atendida, a função recursiva não faz mais chamadas a si mesma e retorna um resultado específico. Caso recursivo: É o caso em que a função se chama novamente com um problema [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/o-que-e-recursividade/">O que é Recursividade</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Recursividade em Lógica de Programação</h2>
<p>Recursividade (ou Recursão) é um conceito em ciência da computação que se refere à capacidade de uma função ou procedimento chamar a si mesmo de forma direta ou indireta durante a sua execução. Em outras palavras, é quando uma função é definida em termos dela mesma.</p>
<p>Ao utilizar a recursividade, uma função pode ser dividida em problemas menores e mais simples, resolvendo-os em etapas sucessivas até alcançar um caso base, que é uma condição que não requer chamadas recursivas e permite a conclusão do processo.</p>
<p>A recursividade é frequentemente usada para resolver problemas que podem ser subdivididos em subproblemas do mesmo tipo. Essa abordagem é especialmente útil quando a estrutura do problema é recursiva por natureza. Alguns exemplos de algoritmos recursivos comuns incluem a busca em árvores, a ordenação rápida (quicksort) e o cálculo do fatorial.</p>
<p>Uma função recursiva geralmente possui dois componentes principais:</p>
<ol>
<li><strong>Caso base</strong>: É uma condição especial que determina quando a recursão deve parar. Quando a condição do caso base é atendida, a função recursiva não faz mais chamadas a si mesma e retorna um resultado específico.</li>
<li><strong>Caso recursivo</strong>: É o caso em que a função se chama novamente com um problema menor ou uma instância simplificada do problema original. A chamada recursiva permite que a função trabalhe em direção ao caso base, resolvendo os subproblemas até que o resultado final seja alcançado.</li>
</ol>
<p>No entanto, é importante ter cuidado ao usar recursão, pois um uso incorreto ou ineficiente pode levar a problemas de desempenho e até mesmo a erros como estouro de pilha (<em>stack overflow</em>) se não houver controle adequado das chamadas recursivas.</p>
<p>Existem duas categorias gerais de recursividade: Recursão Direta e Recursão Indireta.</p>
<h4>Recursão Direta</h4>
<p>Em uma recursão direta, uma função f(A) chama a si própria diretamente &#8211; f(A) chama f(A), em um passo recursivo único.</p>
<h4>Recursão Indireta</h4>
<p>Já a recursividade indireta consiste em uma função f(A) que chama uma função diferente f(B), que por sua vez chama f(A) novamente, Ou seja, é um processo recursivo de dois passos, onde a função original chama outra função que por sua vez chama a função original novamente.</p>
<p>Vamos estudar dois exemplos populares de algoritmos recursivos para ver a recursividade em ação: Fatorial e Fibonacci</p>
<h3>Exemplos de algoritmos recursivos</h3>
<h4>Fatorial recursivo</h4>
<p>O fatorial de um número inteiro positivo qualquer é dado pela fórmula:</p>
<pre><span style="font-size: 14pt; color: #800080;"><strong>n! = n * (n-1) * (n-2) * … * 1</strong></span></pre>
<p>Por exemplo, 5! é igual a:</p>
<pre><span style="font-size: 14pt; color: #ff6600;"><strong>5! = 5 * 4 * 3 * 2 * 1 = 120</strong></span></pre>
<p>Note que o fatorial é uma sequência de operações semelhantes, multiplicações cada vez mais básicas até chegar em 1. Perfeito para a recursão!</p>
<p>O fatorial pode ser calculado de forma recursiva de acordo com a seguinte sequência de operações:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-19568" title="Fatorial Recursivo" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/fatorial-recursivo-funcionamento.jpg" alt="Fatorial Recursivo" width="600" height="456" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/fatorial-recursivo-funcionamento.jpg 796w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/fatorial-recursivo-funcionamento-420x319.jpg 420w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/fatorial-recursivo-funcionamento-768x584.jpg 768w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/fatorial-recursivo-funcionamento-174x131.jpg 174w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Um exemplo de código recursivo em português estruturado é a função fatorial() mostrada a seguir, que calcula o fatorial de um número inteiro passado como argumento:</p>
<pre><span style="color: #339966;"><strong>// Fatorial recursivo</strong></span>
<strong>funcao inteiro fatorial(inteiro x) {</strong>
<strong>  se (x &lt;= 1) {</strong>
<strong>    retorne 1</strong>
<strong>  }</strong>
<strong>  senao {</strong>
<strong>    retorne x * fatorial(x - 1)</strong>
<strong>  }</strong>
<strong>}</strong></pre>
<p>Esta função funciona dividindo o problema de calcular o fatorial de um número em dois subproblemas menores: calcular o fatorial de x &#8211; 1 e multiplicar o resultado por x. O subproblema de calcular o fatorial de x &#8211; 1 é resolvido por uma chamada recursiva para a própria função fatorial().</p>
<p>O resultado da chamada recursiva é então multiplicado por n para obter o resultado do problema original.</p>
<h4>Fibonacci recursivo</h4>
<p>A série de fibonacci é uma sequência numérica que inicia com 0 e 1 e onde cada número subsequente é a soma dos dois números anteriores a ele:</p>
<pre><span style="color: #800080;"><strong>0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...</strong></span></pre>
<p>Trata-se de uma série numérica que ocorre repetidamente na natureza e descreve uma forma em espiral. A razão entre dois Fibonaccis sucessivos converge para o valor <strong>1,618…</strong>, chamado de &#8220;Proporção Áurea&#8221;, que é esteticamente muito agradável e aproveitado em várias áreas do conhecimento, como engenharia e arquitetura.</p>
<p>Bem, podemos definir a série de fibonacci recursivamente da seguinte forma:</p>
<pre><span style="color: #800000;"><strong>fibonacci(0) = 0</strong></span>
<span style="color: #800000;"><strong>fibonacci(1) = 1</strong></span>
<span style="color: #800000;"><strong>fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)</strong></span></pre>
<p>Novamente uma sequência de operações semelhantes. Perfeito para a recursão!</p>
<p>A seguir temos um exemplo de código recursivo em português estruturado que calcula um número de Fibonacci a partir de um número inteiro x passado como argumento:</p>
<pre><span style="color: #339966;"><strong>// Função fibonacci recursivo</strong></span>
<strong>funcao inteiro fibonacci(inteiro x) {</strong>
<strong>  se ((x == 0) ou (x == 1)) {</strong>
<strong>    retorne x</strong>
<strong>  }</strong>
<strong>  retorne fibonacci(x-1) + fibonacci(x-2)</strong>
<strong>}</strong></pre>
<h3>Quais problemas a recursividade pode causar?</h3>
<p>A recursividade é uma técnica de programação que pode ser útil para resolver problemas que podem ser quebrados em subproblemas menores, cada um dos quais pode ser resolvido com uma chamada recursiva. No entanto, a recursividade também pode causar alguns problemas, como:</p>
<ul>
<li>Escopo de variáveis: Quando uma função é chamada recursivamente, ela cria uma nova cópia de seu escopo de variáveis. Isso pode levar a problemas se as variáveis no escopo forem modificadas dentro da função.</li>
<li>Eficiência: Os algoritmos recursivos podem ser muito ineficientes, especialmente para grandes problemas. Isso ocorre porque cada chamada recursiva cria uma nova pilha de chamadas. A pilha de chamadas pode crescer rapidamente e levar a problemas de memória.</li>
<li>Dificuldade de depuração: Os algoritmos recursivos podem ser difíceis de depurar, pois podem ser difíceis de acompanhar o fluxo de controle da função.</li>
</ul>
<p>É importante pesar os riscos e benefícios da recursividade antes de usá-la para resolver um problema. Em alguns casos, a recursividade pode ser a melhor solução, mas em outros casos, pode ser melhor usar uma abordagem iterativa. Se não for usada com cuidado, a recursão pode levar a programas que são lentos ou difíceis de entender.</p>
<h3>Dicas para usar a recursividade com segurança</h3>
<ul>
<li>Use a recursividade apenas quando necessário: Não use a recursividade apenas porque é legal. Use-a apenas quando for a melhor maneira de resolver um problema.</li>
<li>Evite usar recursividade para problemas grandes: Os algoritmos recursivos podem ser muito ineficientes para problemas grandes. Se você estiver enfrentando um problema grande, considere usar uma abordagem iterativa.</li>
<li>Use a recursividade com cuidado: A recursividade pode ser uma ferramenta poderosa, mas é importante usá-la com cuidado. Se não for usada com cuidado, a recursão pode levar a programas que são lentos, difíceis de entender e difíceis de depurar.</li>
</ul>
<p>É isso aí! Nas próximas lições veremos mais técnicas de programação e algoritmos específicos que são importantes para estudantes e profissionais na área de desenvolvimento de software.</p>
<h3>Colabore com a Bóson Treinamentos</h3>
<p>Ajude o canal adquirindo meus cursos na Udemy:</p>
<ul>
<li>Bancos de Dados com MySQL Básico: <a href="https://bit.ly/35QdWE4" target="_blank" rel="noopener">https://bit.ly/35QdWE4</a></li>
<li>Lógica de Programação com Português Estruturado: <a href="https://bit.ly/3QKPn22" target="_blank" rel="noopener">https://bit.ly/3QKPn22</a></li>
<li>Programação em Python do Zero: <a href="https://bit.ly/python-boson" target="_blank" rel="noopener">https://bit.ly/python-boson</a></li>
</ul>
<p>Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: <a href="https://www.amazon.com.br/shop/bosontreinamentos" target="_blank" rel="noopener">https://www.amazon.com.br/shop/bosontreinamentos</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/o-que-e-recursividade/">O que é Recursividade</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/logica-de-programacao/o-que-e-recursividade/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Algoritmo para verificar se um número pertence à série de Fibonacci</title>
		<link>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-um-numero-pertence-a-serie-de-fibonacci/</link>
					<comments>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-um-numero-pertence-a-serie-de-fibonacci/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Tue, 11 Jul 2023 14:37:26 +0000</pubDate>
				<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19547</guid>

					<description><![CDATA[<p>Como verificar se um número pertence à série de Fibonacci Neste artigo vamos criar um algoritmo que permite determinar se um número n fornecido por um usuário pertence à série de Fibonacci ou não.   O que é a sequência de Fibonacci   A sequência (ou série) de Fibonacci é uma sequência de números infinita na qual cada número é a soma dos dois números anteriores a ele. Essa sequência se inicia com os números 0 e 1, e a partir deles, cada número seguinte é calculado efetuando a soma de seus dois antecessores.   Os dez primeiros números na sequência de Fibonacci são:   0, 1, 1, 2, 3, 5, 8, 13, 21 e 34   Podemos gerar a sequência de Fibonacci usando diversas técnicas distintas. Veja como gerar Fibonacci de forma recursiva e iterativa aqui.   Como saber se um número pertence à série de Fibonacci?   Para determinar se um valor está presente na sequência de Fibonacci, podemos empregar uma propriedade interessante, chamada de Fórmula de Binet, que é descrita a seguir:   &#8220;Um número é Fibonacci se e apenas se uma ou ambas as expressões 5*n2 + 4 ou 5*n2 – 4 retornarem um quadrado perfeito.&#8221; [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-um-numero-pertence-a-serie-de-fibonacci/">Algoritmo para verificar se um número pertence à série de Fibonacci</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Como verificar se um número pertence à série de Fibonacci</h2>
<div>Neste artigo vamos criar um algoritmo que permite determinar se um número n fornecido por um usuário pertence à série de Fibonacci ou não.</div>
<h3> </h3>
<h3>O que é a sequência de Fibonacci</h3>
<div> </div>
<div>A sequência (ou série) de Fibonacci é uma sequência de números infinita na qual cada número é a soma dos dois números anteriores a ele.</div>
<div>Essa sequência se inicia com os números 0 e 1, e a partir deles, cada número seguinte é calculado efetuando a soma de seus dois antecessores.</div>
<div> </div>
<div>Os dez primeiros números na sequência de Fibonacci são:</div>
<div> </div>
<div style="text-align: center;"><strong>0, 1, 1, 2, 3, 5, 8, 13, 21 e 34</strong></div>
<div> </div>
<div>Podemos gerar a sequência de Fibonacci usando diversas técnicas distintas. Veja como <a href="http://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-fibonacci-recursivo-e-iterativo-logica-de-programacao/">gerar Fibonacci de forma recursiva e iterativa aqui</a>.</div>
<div> </div>
<h3>Como saber se um número pertence à série de Fibonacci?</h3>
<div> </div>
<div>Para determinar se um valor está presente na sequência de Fibonacci, podemos empregar uma propriedade interessante, chamada de <strong>Fórmula de Binet</strong>, que é descrita a seguir:</div>
<div> </div>
<blockquote>
<div><strong><span style="font-size: 14pt;">&#8220;Um número é Fibonacci se e apenas se uma ou ambas as expressões 5*n<sup>2</sup> + 4 ou 5*n<sup>2</sup> – 4 retornarem um quadrado perfeito.&#8221;</span></strong></div>
</blockquote>
<div> </div>
<div>Um quadrado perfeito é um número inteiro que pode ser expresso como o quadrado exato de outro número inteiro. Ou seja, é um número que pode ser obtido multiplicando um número por si mesmo.</div>
<div> </div>
<div>Veja um algoritmo sugerido para <a href="http://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-numero-e-quadrado-perfeito/">determinação de quadrados perfeitos aqui</a>.</div>
<div> </div>
<div>Vamos agora aos algoritmos para determinar se um número qualquer é Fibonacci ou não.</div>
<div> </div>
<h3>Algoritmo em Português Estruturado</h3>
<div> </div>
<div>A seguir temos uma sugestão de algoritmo, usando o Portugol Studio, que permite saber se um número n fornecido pelo usuário pertence à série de Fibonacci ou não:</div>
<div> </div>
<pre><strong>programa</strong>
<strong>{</strong>
<strong>inclua biblioteca Matematica --&gt; m</strong>
<strong>inclua biblioteca Tipos --&gt; t

</strong><strong>real num</strong>
<strong>inteiro raiz

</strong><strong>  funcao inicio()</strong>
<strong>  {</strong>
<strong>  escreva("Descobrir se número é Fibonacci\n")</strong>
<strong>  escreva("Entre com um número: ")</strong>
<strong>  leia(num)

</strong><strong>  se (eFibonacci(num)) {</strong>
<strong>      escreva(num + " pertence à série de Fibonacci.")</strong>
<strong>  }</strong>
<strong>  senao {</strong>
<strong>      escreva(num + " não pertence à série de Fibonacci.")</strong>
<strong>  }</strong>
<strong>}

</strong><span style="color: #339966;"><strong>  // Função para determinar se número é quadrado perfeito</strong></span>
<strong>  funcao logico quadradoPerfeito(real x) {</strong>
<strong>      raiz = t.real_para_inteiro(m.raiz(x, 2.0))</strong>
<strong>      retorne raiz * raiz == x</strong>
<strong>  }

</strong><span style="color: #339966;"><strong>  // Função para verificar se número pertence à série de Fibonacci</strong></span>
<strong>  funcao logico eFibonacci(real n){</strong>
<strong>      <span style="color: #339966;">// n é Fibonacci se o resultado de 5*n² + 4 ou 5*n² - 4 (ou ambos) for quadrado perfeito.</span></strong>
<strong>      retorne quadradoPerfeito(5*n*n + 4) ou quadradoPerfeito(5*n*n - 4)</strong>
<strong>  }</strong>
<strong>}</strong></pre>
<div> </div>
<div><strong><em>Testando:</em></strong></div>
<div> </div>
<pre><span style="color: #800000;"><strong>Descobrir se número é Fibonacci</strong></span>
<span style="color: #800000;"><strong>Entre com um número: 17711</strong></span>
<span style="color: #800000;"><strong>17711.0 pertence à série de Fibonacci.</strong></span></pre>
<div> </div>
<pre><span style="color: #800000;"><strong>Descobrir se número é Fibonacci</strong></span>
<span style="color: #800000;"><strong>Entre com um número: 12290</strong></span>
<span style="color: #800000;"><strong>12290.0 não pertence à série de Fibonacci.</strong></span></pre>
<div> </div>
<h3>Algoritmo em Python</h3>
<div> </div>
<div>E a seguir temos um algoritmo em Python que permite determinar se um número n fornecido pelo usuário pertence à série de Fibonacci ou não. Para este programa faremos usa da biblioteca padrão de funções matemáticas do Python, o <a href="http://www.bosontreinamentos.com.br/programacao-em-python/7-1-python-funcoes-matematicas-e-modulo-math/">módulo Math</a>:</div>
<div> </div>
<pre><strong>import math

</strong><span style="color: #339966;"><strong># Função que verifica se n é um quadrado perfeito.</strong></span>
<strong>def quadradoPerfeito(x):</strong>
<strong>    raiz = int(math.sqrt(x))</strong>
<strong>    return raiz*raiz == x</strong>
<strong>  </strong>
<span style="color: #339966;"><strong># Verifica se número n pertence à série de Fibonacci</strong></span>
<span style="color: #339966;"><strong># n é Fibonacci se o resultado de 5*n*n + 4 ou 5*n*n - 4 ou ambos</strong></span>
<span style="color: #339966;"><strong># forem quadrados perfeitos.</strong></span>
<strong>def eFibonacci(n):</strong>
<strong>    return quadradoPerfeito(5*n*n + 4) or quadradoPerfeito(5*n*n - 4)

</strong><strong>if __name__=='__main__':</strong>
<strong>    print("Verificar se número é Fibonacci")</strong>
<strong>    n = int(input('Digite um número qualquer, positivo: '))

</strong><strong>    if(eFibonacci(n)):</strong>
<strong>        print(f"{n} pertence à série de Fibonacci.")</strong>
<strong>    else:</strong>
<strong>        print(f"{n} não pertence à série de Fibonacci.")</strong></pre>
<div>        </div>
<div>O teste é similar ao do algoritmo anterior.</div>
<div> </div>
<div>É isso aí! Nos próximos tutoriais vamos explorar mais algoritmos interessantes e curiosos, como a Torre de Hanoi e a construção de jogos, como o Jogo da Velha e outros.</div>
<div> </div>
<div> </div>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-um-numero-pertence-a-serie-de-fibonacci/">Algoritmo para verificar se um número pertence à série de Fibonacci</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-um-numero-pertence-a-serie-de-fibonacci/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Algoritmo para verificar se número é quadrado perfeito</title>
		<link>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-numero-e-quadrado-perfeito/</link>
					<comments>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-numero-e-quadrado-perfeito/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Fri, 07 Jul 2023 12:08:05 +0000</pubDate>
				<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Matemática]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19539</guid>

					<description><![CDATA[<p>O que é um quadrado perfeito Um quadrado perfeito é um número inteiro que pode ser expresso como o quadrado exato de outro número inteiro. Em outras palavras, é um número que pode ser obtido multiplicando um número por si mesmo.   Por exemplo, 4 é um quadrado perfeito porque pode ser obtido multiplicando 2 por 2 (2 * 2 = 4). Da mesma forma, 9 é um quadrado perfeito porque pode ser obtido multiplicando 3 por 3 (3 * 3 = 9).   Já números como 6, 13 ou 21 não são quadrados perfeitos, pois não podem ser expressos como o quadrado exato de um número inteiro.   Algoritmo para verificar se um número é um quadrado perfeito Podemos verificar se um número é um quadrado perfeito como os seguintes passos: Calculamos a raiz quadrada do número n fornecido. Eliminamos a parte decimal da raiz calculada. Multiplicamos a parte inteira que restou por ela própria. Comparamos o resultado dessa multiplicação com o valor n original. Se os valores forem idênticos, o número é um quadrado perfeito; caso contrário, não o é. Vamos representar esses passos criando algoritmos: primeiramente um código usando português estruturado e, na sequência, o mesmo algoritmo [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-numero-e-quadrado-perfeito/">Algoritmo para verificar se número é quadrado perfeito</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>O que é um quadrado perfeito</h2>
<div>Um quadrado perfeito é um número inteiro que pode ser expresso como o quadrado exato de outro número inteiro. Em outras palavras, é um número que pode ser obtido multiplicando um número por si mesmo.</div>
<div> </div>
<div>Por exemplo, 4 é um quadrado perfeito porque pode ser obtido multiplicando 2 por 2 (2 * 2 = 4). Da mesma forma, 9 é um quadrado perfeito porque pode ser obtido multiplicando 3 por 3 (3 * 3 = 9).</div>
<div> </div>
<div>Já números como 6, 13 ou 21 não são quadrados perfeitos, pois não podem ser expressos como o quadrado exato de um número inteiro.</div>
<div> </div>
<h3>Algoritmo para verificar se um número é um quadrado perfeito</h3>
<div>Podemos verificar se um número é um quadrado perfeito como os seguintes passos:</div>
<ol>
<li>Calculamos a raiz quadrada do número n fornecido.</li>
<li>Eliminamos a parte decimal da raiz calculada.</li>
<li>Multiplicamos a parte inteira que restou por ela própria.</li>
<li>Comparamos o resultado dessa multiplicação com o valor n original.</li>
<li>Se os valores forem idênticos, o número é um quadrado perfeito; caso contrário, não o é.</li>
</ol>
<div>Vamos representar esses passos criando <a href="http://www.bosontreinamentos.com.br/logica-de-programacao/02-logica-de-programacao-algoritmos-e-fluxogramas/">algoritmos</a>: primeiramente um código usando português estruturado e, na sequência, o mesmo algoritmo em <a href="https://www.python.org/" target="_blank" rel="noopener">Python</a>.</div>
<div> </div>
<h3>Algoritmo em Português Estruturado</h3>
<div>Como verificar se um número é um quadrado perfeito usando o <a href="http://www.bosontreinamentos.com.br/curso-de-logica-de-programacao/">Portugol Studio</a>:</div>
<div> </div>
<pre><strong>programa</strong>
<strong>{</strong>
<strong>inclua biblioteca Matematica --&gt; m</strong>
<strong>inclua biblioteca Tipos --&gt; t

</strong><strong>real n</strong>
<strong>inteiro raiz 

</strong><strong>funcao inicio()</strong>
<strong>{</strong>
<strong>  escreva("Verificar se número é quadrado perfeito")</strong>
<strong>  escreva("\nDigite um número qualquer, positivo: ")</strong>
<strong>  leia(n)

</strong><strong>  se(quadradoPerfeito(n)){</strong>
<strong>      escreva(n + " é quadrado perfeito.")</strong>
<strong>  }</strong>
<strong>  senao {</strong>
<strong>      escreva(n + " não é quadrado perfeito.")</strong>
<strong>  }</strong>
<strong>}

</strong><strong>funcao logico quadradoPerfeito(real x) {</strong>
<strong>  raiz = t.real_para_inteiro(m.raiz(x, 2.0))</strong>
<strong>  retorne raiz * raiz == x</strong>
<strong>}</strong>
<strong>}</strong></pre>
<h3>Algoritmo em Python</h3>
<div>Como verificar se um número é um quadrado perfeito usando a <a href="http://www.bosontreinamentos.com.br/programacao-com-python/">linguagem Python</a></div>
<div> </div>
<div><img loading="lazy" decoding="async" class="aligncenter wp-image-19414" title="Quadrado Perfeito em Python" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/05/python-logo-boson.png" alt="Programação em linguagem Python para iniciantes" width="200" height="200" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/05/python-logo-boson.png 529w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/05/python-logo-boson-170x170.png 170w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/05/python-logo-boson-420x420.png 420w" sizes="auto, (max-width: 200px) 100vw, 200px" /></div>
<div>Código:</div>
<div> </div>
<pre><strong>import math

</strong><span style="color: #339966;"><strong># Função que retorna true se n for quadrado perfeito, e false se não for.</strong></span>
<strong>def quadradoPerfeito(x):</strong>
<strong>    raiz = int(math.sqrt(x))</strong>
<strong>    return raiz*raiz == x

</strong><strong>if __name__=='__main__':</strong>
<strong>    print("Verificar se número é quadrado perfeito")</strong>
<strong>    n = float(input('Digite um número qualquer, positivo: '))</strong>
<strong>    if(quadradoPerfeito(n)):</strong>
<strong>        print(f"{n} é quadrado perfeito.")</strong>
<strong>    else:</strong>
<strong>        print(f"{n} não é quadrado perfeito.")</strong></pre>
<div> </div>
<div> </div>
<div>É isso aí! No próximo tutorial veremos um uso bem interessante do cálculo de quadrados perfeitos: verificar se um número pertence à sequência de Fibonacci ou não.</div>
<div> </div>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-numero-e-quadrado-perfeito/">Algoritmo para verificar se número é quadrado perfeito</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-verificar-se-numero-e-quadrado-perfeito/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Algoritmo para Fibonacci Recursivo e Iterativo &#8211; Lógica de Programação</title>
		<link>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-fibonacci-recursivo-e-iterativo-logica-de-programacao/</link>
					<comments>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-fibonacci-recursivo-e-iterativo-logica-de-programacao/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Wed, 05 Jul 2023 12:09:10 +0000</pubDate>
				<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Matemática]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19517</guid>

					<description><![CDATA[<p>Algoritmo para Fibonacci Recursivo e Iterativo A série de Fibonacci é uma sequência numérica infinita em que cada número subsequente é a soma dos dois números anteriores. A sequência começa com os números 0 e 1, e a partir deles, cada número seguinte é calculado somando os dois números anteriores. Portanto, a sequência começa da seguinte forma: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, e assim por diante. A sequência começa em 0 e 1, porém alguns autores dizem que a sequência começa em 1 e 1, e o próprio Fibonacci iniciava a sequência em 1 e 2. O algoritmo para gerar a sequência permanece o mesmo para todos os casos, com ajustes mínimos no valor inicial. Por conta desse padrão numérico interessante, a série de Fibonacci é amplamente estudada e aplicada em vários campos, como matemática, ciência da computação, biologia, arte e finanças. Além disso, a proporção entre os números adjacentes na sequência de Fibonacci, chamada de &#8220;razão áurea&#8221;, &#8220;proporção áurea&#8221; ou &#8220;número de ouro&#8221;, que é aproximadamente 1,618, é considerada esteticamente agradável e é encontrada em muitas formas naturais, como conchas, flores e galáxias (descrevendo uma forma em espiral), além de ser utilizada em projetos [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-fibonacci-recursivo-e-iterativo-logica-de-programacao/">Algoritmo para Fibonacci Recursivo e Iterativo &#8211; Lógica de Programação</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Algoritmo para Fibonacci Recursivo e Iterativo</h2>
<p>A série de <strong>Fibonacci</strong> é uma sequência numérica infinita em que cada número subsequente é a soma dos dois números anteriores. A sequência começa com os números 0 e 1, e a partir deles, cada número seguinte é calculado somando os dois números anteriores.</p>
<p>Portanto, a sequência começa da seguinte forma:</p>
<p style="text-align: center;"><strong>0, 1, 1, 2, 3, 5, 8, 13, 21, 34, e assim por diante.</strong></p>
<p>A sequência começa em 0 e 1, porém alguns autores dizem que a sequência começa em 1 e 1, e o próprio Fibonacci iniciava a sequência em 1 e 2.</p>
<p>O algoritmo para gerar a sequência permanece o mesmo para todos os casos, com ajustes mínimos no valor inicial.</p>
<p>Por conta desse padrão numérico interessante, a série de Fibonacci é amplamente estudada e aplicada em vários campos, como matemática, ciência da computação, biologia, arte e finanças.</p>
<p>Além disso, a proporção entre os números adjacentes na sequência de Fibonacci, chamada de &#8220;razão áurea&#8221;, &#8220;proporção áurea&#8221; ou &#8220;número de ouro&#8221;, que é aproximadamente 1,618, é considerada esteticamente agradável e é encontrada em muitas formas naturais, como conchas, flores e galáxias (descrevendo uma forma em espiral), além de ser utilizada em projetos de arquitetura e design.</p>
<div id="attachment_19521" style="width: 410px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-19521" class="wp-image-19521" title="Espiral de Fibonacci" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/espiral-fibonacci.jpg" alt="Espiral de Fibonacci" width="400" height="249" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/espiral-fibonacci.jpg 988w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/espiral-fibonacci-420x261.jpg 420w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/espiral-fibonacci-768x478.jpg 768w" sizes="auto, (max-width: 400px) 100vw, 400px" /><p id="caption-attachment-19521" class="wp-caption-text">Espiral que representa a sequência de Fibonacci</p></div>
<p>Neste tutorial vou mostrar como criar algoritmos para lógica de programação com Portugol que permitem gerar a sequência de Fibonacci, tanto de forma recursiva quanto iterativa.</p>
<h3>De onde vem o nome &#8220;Fibonacci&#8221;?</h3>
<p>Fibonacci, cujo nome verdadeiro era Leonardo de Pisa, foi um matemático italiano do século XIII. Ele é mais conhecido por introduzir a sequência numérica que leva seu nome, a sequência de Fibonacci, em seu livro &#8220;Liber Abaci&#8221; (Livro do Ábaco), publicado em 1202. Fibonacci significa <em>filius Bonacci</em>, ou filho de Bonaccio</p>
<p>Fibonacci viajou extensivamente pelo Mediterrâneo e estudou os sistemas numéricos usados na época, incluindo o sistema de numeração hindu-arábico. Ele ficou fascinado pelas propriedades matemáticas desses sistemas e, em seu livro, introduziu essa sequência numérica como um exemplo de progressão aritmética encontrada em um problema envolvendo a reprodução de coelhos.</p>
<div id="attachment_19522" style="width: 509px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-19522" class="wp-image-19522" title="Leonardo de Pisa, o Fibonacci" src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/leonardo-de-pisa-fibonacci.jpg" alt="Leonardo de Pisa, o Fibonacci" width="499" height="378" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/leonardo-de-pisa-fibonacci.jpg 942w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/leonardo-de-pisa-fibonacci-420x318.jpg 420w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/leonardo-de-pisa-fibonacci-768x581.jpg 768w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/07/leonardo-de-pisa-fibonacci-174x131.jpg 174w" sizes="auto, (max-width: 499px) 100vw, 499px" /><p id="caption-attachment-19522" class="wp-caption-text">Leonardo de Pisa, o Fibonacci</p></div>
<p>Embora não tenha sido o descobridor da sequência em si, Fibonacci popularizou a sequência e demonstrou suas propriedades matemáticas e aplicações em várias áreas. Seu trabalho teve um impacto duradouro na matemática e continua sendo estudado e aplicado até hoje.</p>
<p><strong>Curiosidade</strong>: O nome &#8220;<em>sequência de Fibonacci</em>&#8221; foi empregado pela primeira vez pelo matemático francês François Édouard Anatole Lucas, no século XIX (o mesmo matemático que inventou a Torre de Hanói).</p>
<h3>Algoritmo de Fibonacci Recursivo</h3>
<p>Podemos definir a série de fibonacci recursivamente da seguinte forma:</p>
<pre><em><span style="color: #ff6600;"><strong>Casos base:</strong></span></em>
<strong><span style="color: #800000;">fibonacci(0) = 0
fibonacci(1) = 1

</span><em><span style="color: #ff6600;">Caso geral:</span></em>
<span style="color: #800000;">fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)</span></strong></pre>
<p>Uma sequência de operações semelhantes. Perfeito para a recursão!</p>
<p>Exemplo: Qual o terceiro valor de Fibonacci da sequência?</p>
<pre><span style="color: #800080;"><strong>fib(3) = ?</strong></span>
<span style="color: #800080;"><strong>fib(3) = <span style="color: #ff6600;">fib(3-1)</span> + <span style="color: #ff0000;">fib(3-2)</span> →</strong></span>
<span style="color: #800080;"><strong>fib(3) = <span style="color: #ff6600;">fib(2)</span> + <span style="color: #ff0000;">fib(1)</span> →</strong></span>
<span style="color: #800080;"><strong>fib(3) = <span style="color: #ff6600;">fib(2-1)</span> + <span style="color: #ff6600;">fib(2-2)</span> + <span style="color: #ff0000;">1</span> →</strong></span>
<span style="color: #800080;"><strong>fib(3) = <span style="color: #ff6600;">fib(1)</span> + <span style="color: #ff6600;">fib(0)</span> + <span style="color: #ff0000;">1</span> →</strong></span>
<span style="color: #800080;"><strong>fib(3) = <span style="color: #ff6600;">1</span> + <span style="color: #ff6600;">0</span> + <span style="color: #ff0000;">1</span> →</strong></span>
<span style="color: #800080;"><strong>fib(3) = <span style="color: #800000;">2</span></strong></span></pre>
<p>Isso significa que o terceiro fibonacci (assumindo que o primeiro é o zerésimo valor) é o número 2:</p>
<table style="border-collapse: collapse; width: 40.7119%; height: 49px;" border="1">
<tbody>
<tr>
<td style="width: 25%; text-align: center;"><em><strong>F<sub>0</sub></strong></em></td>
<td style="width: 25%; text-align: center;"><em><strong>F<sub>1</sub></strong></em></td>
<td style="width: 25%; text-align: center;"><em><strong>F<sub>2</sub></strong></em></td>
<td style="width: 25%; text-align: center;"><em><strong>F<sub>3</sub></strong></em></td>
</tr>
<tr>
<td style="width: 25%; text-align: center;"><span style="color: #800080;"><strong>0</strong></span></td>
<td style="width: 25%; text-align: center;"><span style="color: #800080;"><strong>1</strong></span></td>
<td style="width: 25%; text-align: center;"><span style="color: #800080;"><strong>1</strong></span></td>
<td style="width: 25%; text-align: center;"><span style="color: #800080;"><strong>2</strong></span></td>
</tr>
</tbody>
</table>
<p>Vamos criar um algoritmo usando o Portugol Studio para obter a sequência de fibonacci com a quantidade de elementos determinados pelo usuário:</p>
<pre>programa
{

inteiro num

funcao inicio()
{

  escreva("Obter sequência de Fibonacci\n")
  escreva("Entre com um número: ")
  leia(num)
  escreva(num + "º fibonacci: " + fibonacci(num) + "\n") 

  escreva("\nMostrar a sequência completa:\n")
  para (inteiro i = 0; i &lt; num; i++) {
    escreva(fibonacci(i) + " ")
  }

}

<span style="color: #339966;">// Função fibonacci recursivo</span>
funcao inteiro fibonacci(inteiro x) {
  se ((x == 0) ou (x == 1)) {
      retorne x
  }
  retorne fibonacci(x-1) + fibonacci(x-2)
}

}</pre>
<div>A função é definida como uma função recursiva, o que significa que ela se chama a si mesma repetidamente para calcular o valor desejado. Vejamos o funcionamento dessa função passo a passo:</div>
<div> </div>
<ol>
<li>A função &#8220;fibonacci()&#8221; recebe um número inteiro x como parâmetro.</li>
<li>Primeiro, ela verifica se x é igual a 0 ou 1 usando a condição ((x == 0) ou (x == 1)). Esses são os <em>casos base</em> da sequência de Fibonacci, em que o valor é conhecido e não precisa ser calculado. Se x for igual a 0 ou 1, a função retorna o próprio valor de x, utilizando a instrução &#8220;<strong>retorne x</strong>&#8220;.</li>
<li>Se o valor de x não for 0 ou 1, a função chama a si mesma para calcular os termos anteriores necessários para calcular o valor atual. Ela retorna a soma dos resultados de duas chamadas recursivas: <strong>fibonacci(x-1)</strong> e <strong>fibonacci(x-2)</strong>.<br />
fibonacci(x-1) calcula o valor do termo anterior ao termo x.<br />
fibonacci(x-2) calcula o valor do termo dois lugares antes do termo x.<br />
A soma desses dois valores representa o valor do termo x na sequência de Fibonacci.</li>
<li>A função continua a se chamar recursivamente até que atinja um dos casos base (x = 0 ou x = 1), momento em que retorna o valor correspondente.</li>
<li>A função retorna o valor do termo de Fibonacci correspondente ao número x fornecido.</li>
</ol>
<div>Essa implementação algorítmica da função Fibonacci é simples, mas pode se tornar ineficiente para valores de x grandes, devido à natureza recursiva da função. Isso ocorre porque a função realizará várias chamadas repetidas para calcular os mesmos termos novamente. Nesses casos, pode ser mais eficiente usar uma abordagem iterativa, que é o que faremos a seguir.</div>
<div> </div>
<h3>Algoritmo de Fibonacci Iterativo</h3>
<div>Outra opção para gerar uma sequência de fibonacci é empregar um algoritmo iterativo em vez de recursivo. Neste caso, em vez de a função realizar chamadas a si própria repetidas vezes (recursividade), usamos um laço de repetição comum para realizar o cálculo dos valores a serem gerados.</div>
<div> </div>
<div>Vamos ao algoritmo:</div>
<div>
<pre>programa
{

inteiro num

funcao inicio()
{

  escreva("Obter sequencia de Fibonacci\n")
  escreva("Entre com um número: ")
  leia(num)
  
  escreva("\nMostrar a sequência completa:\n")
  para (inteiro i = 1; i &lt;= num; i++) {
    escreva(fibonacci(i) + " ")
  }

}

<span style="color: #339966;">// Função fibonacci iterativo</span>
funcao inteiro fibonacci(inteiro x) {
  inteiro antepNum, penNum = 0, numAtual = 1

  se ((x == 0) ou (x == 1)) {
       retorne x
  }
  para (inteiro i = 2; i &lt;= x; i++) {
    antepNum = penNum
    penNum = numAtual
    numAtual = antepNum + penNum
  }
  retorne numAtual
}

}</pre>
</div>
<div>Diferente da abordagem anterior, que era recursiva, este algoritmo utiliza uma abordagem iterativa. Vamos analisar o funcionamento dessa função passo a passo:</div>
<div> </div>
<ol>
<li>A função &#8220;fibonacci()&#8221; recebe um número inteiro x como parâmetro.</li>
<li>Em seguida, três variáveis inteiras são declaradas: antepNum, penNum e numAtual. Inicialmente, antepNum e penNum são definidos como 0, e numAtual é definido como 1. Essas variáveis são usadas para acompanhar os valores dos termos anteriores e atual da sequência de Fibonacci.</li>
<li>É iniciado um loop &#8220;para&#8221; com uma variável de controle inteira i, que começa em 2 e vai até x. Esse loop irá iterar x-2 vezes, pois os primeiros termos já são conhecidos.</li>
<li>Dentro do loop, os valores antigos são atualizados para avançar na sequência de Fibonacci. A variável antepNum recebe o valor de penNum, que é o termo anterior, e penNum recebe o valor de numAtual, que é o termo atual.</li>
<li>Em seguida, a variável numAtual é atualizada somando antepNum e penNum. Essa soma representa o próximo termo da sequência de Fibonacci.</li>
<li>O loop continua até que i alcance o valor x, momento em que todos os termos necessários terão sido calculados.</li>
<li>Após o término do loop, a função retorna o valor de numAtual, que é o termo de Fibonacci correspondente ao número x fornecido.</li>
</ol>
<div>Note que a função que gera a sequência de fibonacci se tornou um pouco mais complexa, porém provavelmente mais fácil de entender. A seguir vamos comparar a performance de ambas as funções.</div>
<div> </div>
<h3>Comparação entre fibonacci iterativo e recursivo</h3>
<div>Às vezes, o código de aparência mais limpa não é o melhor. Em termos de <a href="http://www.bosontreinamentos.com.br/estruturas-de-dados/o-que-e-notacao-big-o-em-programacao-e-analise-de-algoritmos/">notação Big O</a>, a solução iterativa será executada mais rapidamente com uma notação de O(n), enquanto a solução recursiva é O(2^n), e isso se torna facilmente perceptível ao tentar gerar sequências de fibonacci maiores.</div>
<div> </div>
<div>Se executarmos os dois algoritmos passando um valor como 40 para gerar sequência, poderemos claramente perceber a diferença. O resultado é a abordagem iterativa executando muito mais rápido do que a recursiva.</div>
<div> </div>
<div>A abordagem iterativa do algoritmo Fibonacci é mais eficiente do que a abordagem recursiva, especialmente para valores de x maiores. A função itera apenas uma vez, atualizando os valores necessários em cada iteração, em vez de realizar chamadas recursivas repetidas. Isso torna o algoritmo mais rápido e eficiente em termos de uso de memória.</div>
<div> </div>
<div>Portanto, cuidado ao empregar algoritmos recursivos &#8211; nem sempre são a maneira mais adequada de resolver problemas em computação.</div>
<div> </div>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-fibonacci-recursivo-e-iterativo-logica-de-programacao/">Algoritmo para Fibonacci Recursivo e Iterativo &#8211; Lógica de Programação</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-fibonacci-recursivo-e-iterativo-logica-de-programacao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Algoritmo para validação de RG SSP/SP (dígitos verificadores) em Python</title>
		<link>https://www.bosontreinamentos.com.br/programacao-em-python/algoritmo-para-validacao-de-rg-ssp-sp-digitos-verificadores-em-python/</link>
					<comments>https://www.bosontreinamentos.com.br/programacao-em-python/algoritmo-para-validacao-de-rg-ssp-sp-digitos-verificadores-em-python/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Fri, 30 Jun 2023 19:20:53 +0000</pubDate>
				<category><![CDATA[Programação em Python]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19504</guid>

					<description><![CDATA[<p>Validação de RG SSP/SP (dígitos verificadores) em Python Neste tutorial mostro como realizar o cálculo do dígito verificador para validação de RG emitido no estado de SP, usando um script criado em Python – e que você pode adaptar para a linguagem de programação que desejar. Formato do RG O formato de um RG (Registro Geral) de São Paulo é composto por 9 dígitos no no formato XX.XXX.XXX-Y, onde os &#8220;X&#8221; representam os dígitos numéricos e o &#8220;Y&#8221; representa o dígito verificador (DV).  Esse dígito verificador é o módulo 11 dos 8 dígitos anteriores, calculado usando um algoritmo específico &#8211; que vamos criar em Python. No caso do RG, o DV corresponde ao resto da divisão por 11 do somatório da multiplicação de cada um dos outros oito algarismos respectivamente por 9, 8, 7, 6, 5, 4, 3, 2, a partir do dígito mais à esquerda. O resto 10 é considerado como valor X. Observação importante: Em outros estados o formato do RG pode ser levemente diferente, e o algoritmo que mostrarei aqui pode não funcionar corretamente para realizar a validação, sendo necessário criar um algoritmo diferente. Como calcular o dígito verificador do RG: Exemplo Vejamos como realizar o cálculo do [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/algoritmo-para-validacao-de-rg-ssp-sp-digitos-verificadores-em-python/">Algoritmo para validação de RG SSP/SP (dígitos verificadores) em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Validação de RG SSP/SP (dígitos verificadores) em Python</h2>
<p>Neste tutorial mostro como realizar o cálculo do dígito verificador para validação de RG emitido no estado de SP, usando um script criado em <a href="http://www.bosontreinamentos.com.br/programacao-com-python/">Python</a> – e que você pode adaptar para a linguagem de programação que desejar.</p>
<h3>Formato do RG</h3>
<p>O formato de um RG (Registro Geral) de São Paulo é composto por 9 dígitos no no formato <span style="color: #800000;"><strong>XX.XXX.XXX-Y</strong></span>, onde os &#8220;<span style="color: #800000;">X</span>&#8221; representam os dígitos numéricos e o &#8220;<span style="color: #800000;">Y</span>&#8221; representa o dígito verificador (DV). </p>
<p>Esse dígito verificador é o módulo 11 dos 8 dígitos anteriores, calculado usando um algoritmo específico &#8211; que vamos criar em Python.</p>
<p>No caso do RG, o DV corresponde ao resto da divisão por 11 do somatório da multiplicação de cada um dos outros oito algarismos respectivamente por 9, 8, 7, 6, 5, 4, 3, 2, a partir do dígito mais à esquerda. O resto 10 é considerado como valor X.</p>
<p><em><strong>Observação importante:</strong></em> Em outros estados o formato do RG pode ser levemente diferente, e o algoritmo que mostrarei aqui pode não funcionar corretamente para realizar a validação, sendo necessário criar um algoritmo diferente.</p>
<h3>Como calcular o dígito verificador do RG: Exemplo</h3>
<p>Vejamos como realizar o cálculo do dígito verificador do RG por meio de um exemplo. Suponhamos o RG de número 29.465.327-2. Como verificar se ele é válido?</p>
<p>Para isso temos de efetuar a validação do dígito verificador – que no caso é o valor 2. Vamos ao processo:</p>
<h4>Passo 1</h4>
<p>Multiplicar os oito primeiros dígitos do RG pela sequência numérica de 9 a 2 e realizar sua soma:</p>
<table style="border-collapse: collapse; width: 65.1835%; height: 28px;" border="1">
<tbody>
<tr>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>2</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>9</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>4</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>2</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #0000ff;"><strong>x</strong></span></td>
</tr>
<tr>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>9</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>8</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>4</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>2</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #0000ff;"><strong>=</strong></span></td>
</tr>
<tr>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>18</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>72</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>28</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>36</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>25</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>12</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>6</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #ff0000;"><strong>14</strong></span></td>
<td style="width: 11.1111%; text-align: center;"> </td>
</tr>
</tbody>
</table>
<p>Somatório dos valores obtidos:</p>
<p style="text-align: center;"><strong>18 + 72 + 28 + 36 + 25 + 12 + 6 + 14 = <span style="color: #ff0000;">211</span></strong></p>
<h4>Passo 2</h4>
<p>Calcular o módulo 11 do somatório &#8211; ou seja, o resto da divisão por 11 do somatório obtido no passo 1.</p>
<p>O valor resultante desse cálculo é o dígito verificador do RG:</p>
<p style="text-align: center;"><strong>211 % 11 = <span style="color: #ff0000;">2</span></strong></p>
<p>Dígito verificador calculado: <strong>2</strong> → RG validado</p>
<p>Obs.: O símbolo % representa a <a href="http://www.bosontreinamentos.com.br/logica-de-programacao/06-logica-de-programacao-operadores-e-expressoes-aritmeticas/">operação de módulo</a>.</p>
<p>Note que existe um caso especial a ser tratado aqui:</p>
<ol>
<li>Caso o resto calculado seja igual a 10, o dígito verificador será considerado como a letra <strong>X</strong> (que representa 10 em algarismos romanos).</li>
</ol>
<h3>Programa em Python para validação de RG SSP/SP</h3>
<pre><span style="color: #339966;"><strong># Função de validação do dígito verificador de RG SSP/SP em Python</strong></span>
<span style="color: #ff0000;"><strong>def validaRG(rg):</strong></span>
<span style="color: #ff0000;"><strong>    cont = 9</strong></span>
<span style="color: #ff0000;"><strong>    soma = 0</strong></span>
<span style="color: #339966;"><strong>    # Somatório das multiplicações dos 8 primeiros dígitos do rg</strong></span>
<span style="color: #ff0000;"><strong>    for digito in rg[0:8]:</strong></span>
<span style="color: #ff0000;"><strong>        soma += int(digito) * cont</strong></span>
<span style="color: #ff0000;"><strong>        cont -= 1</strong></span>
  
<span style="color: #339966;"><strong>    # Calcula dv fazendo somatório mód 11</strong></span>
<span style="color: #ff0000;"><strong>    dv = soma % 11
</strong></span>
<span style="color: #ff0000;"><strong><span style="color: #339966;">  # Verifica se dv calculado coincide com dv fornecido no RG (último dígito)</span>
    if ((dv == 10) &amp; (rg[-1] == 'X')):
        return(True)
    elif (int(rg[-1]) == dv):
        return(True)
    else:
        return(False)
</strong></span>
<span style="color: #ff0000;"><strong>if __name__=='__main__':</strong></span>
<span style="color: #ff0000;"><strong>    rg = input("Digite seu RG, sem pontos ou traço: ")</strong></span>
<span style="color: #ff0000;"><strong>    res = validaRG(rg)</strong></span>
<span style="color: #ff0000;"><strong>    if (res == True):</strong></span>
<span style="color: #ff0000;"><strong>        print("RG validado com sucesso.")</strong></span>
<span style="color: #ff0000;"><strong>    else:</strong></span>
<span style="color: #ff0000;"><strong>        print("Documento inválido.")</strong></span></pre>
<h3>Funcionamento do algoritmo</h3>
<p>O algoritmo começa definindo uma função de nome <strong>validaRG(rg)</strong> e criando dentro dela as variáveis cont e soma. A variável cont é inicializada com o valor 9 e a variável soma é inicializada com o valor 0.</p>
<p>Em seguida, é iniciado um laço<em> for</em> que percorre os primeiros 8 dígitos do número de RG fornecido. Para cada dígito, o algoritmo multiplica o valor do dígito pela variável cont (que é decrementada em cada iteração) e acumula o resultado na variável soma.</p>
<p>Após o término do laço, o algoritmo calcula o dígito verificador (dv) fazendo o módulo 11 da soma.</p>
<p>Em seguida, o algoritmo verifica se o dígito verificador calculado coincide com o dígito verificador fornecido no RG (último dígito).</p>
<p>Se o dígito verificador calculado for 10 e o último dígito do RG for &#8216;X&#8217;, isso é considerado uma coincidência e retorna <em>True</em>. Caso contrário, se o último dígito do RG for um número e for igual ao dígito verificador calculado, também retorna <em>True</em>.</p>
<p>Caso contrário, retorna <em>False</em>.</p>
<p>No corpo principal do programa <strong><em>if __name__==&#8217;__main__&#8217;:</em></strong>, o algoritmo solicita que o usuário digite o número do RG, sem pontos ou traços. Em seguida, chama a função definida validaRG() passando o número do RG como argumento e armazena o resultado na variável res.</p>
<p>Por fim, o algoritmo imprime uma mensagem indicando se o RG foi validado com sucesso ou se é inválido, com base no resultado retornado pela função validaRG.</p>
<h3>Teste</h3>
<p>Teste o algoritmo com seu número de RG, e com outros números, como <strong>45.727.503-0</strong> (contém DV zero no final) e <strong>37.606.335-X</strong> (dígito verificador é a letra X), para verificar também os casos especiais.</p>
<p>Tente também melhorar o programa para que aceite a digitação dos documentos com pontos e traços, como exercício.</p>
<p>É isso aí!</p>
<p>Veja também: <a href="http://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-validacao-de-cpf-digitos-verificadores-logica-de-programacao/">Como calcular e validar dígitos verificadores em números de CPF</a></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/programacao-em-python/algoritmo-para-validacao-de-rg-ssp-sp-digitos-verificadores-em-python/">Algoritmo para validação de RG SSP/SP (dígitos verificadores) em Python</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/programacao-em-python/algoritmo-para-validacao-de-rg-ssp-sp-digitos-verificadores-em-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Algoritmo para validação de CPF (dígitos verificadores) &#8211; Lógica de Programação</title>
		<link>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-validacao-de-cpf-digitos-verificadores-logica-de-programacao/</link>
					<comments>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-validacao-de-cpf-digitos-verificadores-logica-de-programacao/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Mon, 26 Jun 2023 17:31:12 +0000</pubDate>
				<category><![CDATA[Lógica de Programação]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19477</guid>

					<description><![CDATA[<p>Validação de CPF com Portugol O CPF (Cadastro de Pessoas Físicas) é um documento de identificação emitido pela Receita Federal aqui no Brasil, criado em 1970. Cada indivíduo residente no país (cidadãos brasileiros e estrangeiros residentes) possui um número único de CPF. Esse documento é essencial para diversas atividades e serviços, como por exemplo abertura de contas bancárias, realização de compras, emissão de documentos oficiais, declaração de imposto de renda, entre outros. O CPF é composto por 11 dígitos e é utilizado para identificar cada pessoa de forma única. Os dois últimos dígitos do CPF são conhecidos como &#8220;dígitos verificadores&#8221; e são utilizados para verificar a validade do número. Esses dígitos são calculados a partir dos nove primeiros dígitos do CPF, utilizando um algoritmo específico, que estudaremos a seguir. Neste tutorial mostro como realizar o cálculo dos dígitos verificadores para validação de CPF, usando um algoritmo criado no Portugol Studio &#8211; e que você pode adaptar para a linguagem de programação que desejar. Formato do CPF O formato de um CPF (Cadastro de Pessoas Físicas) é composto por 11 dígitos no seguinte padrão: XXX.XXX.XXX-YY, onde os &#8220;X&#8221; representam os dígitos numéricos e os &#8220;Y&#8221; representam os dígitos verificadores.   O [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-validacao-de-cpf-digitos-verificadores-logica-de-programacao/">Algoritmo para validação de CPF (dígitos verificadores) &#8211; Lógica de Programação</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Validação de CPF com Portugol</h3>
<div>
<p>O CPF (Cadastro de Pessoas Físicas) é um documento de identificação emitido pela Receita Federal aqui no Brasil, criado em 1970. Cada indivíduo residente no país (cidadãos brasileiros e estrangeiros residentes) possui um número único de CPF. Esse documento é essencial para diversas atividades e serviços, como por exemplo abertura de contas bancárias, realização de compras, emissão de documentos oficiais, declaração de imposto de renda, entre outros.</p>
<p>O CPF é composto por 11 dígitos e é utilizado para identificar cada pessoa de forma única. Os dois últimos dígitos do CPF são conhecidos como &#8220;<strong>dígitos verificadores</strong>&#8221; e são utilizados para verificar a validade do número.</p>
<p>Esses dígitos são calculados a partir dos nove primeiros dígitos do CPF, utilizando um algoritmo específico, que estudaremos a seguir.</p>
<p>Neste tutorial mostro como realizar o cálculo dos dígitos verificadores para validação de CPF, usando um algoritmo criado no Portugol Studio &#8211; e que você pode adaptar para a linguagem de programação que desejar.</p>
<h3>Formato do CPF</h3>
</div>
<div>O formato de um CPF (Cadastro de Pessoas Físicas) é composto por 11 dígitos no seguinte padrão: <strong>XXX.XXX.XXX-YY</strong>, onde os &#8220;X&#8221; representam os dígitos numéricos e os &#8220;Y&#8221; representam os dígitos verificadores.</div>
<div> </div>
<div>O penúltimo dígito é o DV módulo 11 dos nove dígitos anteriores e o último dígito é o DV módulo 11 dos dez dígitos anteriores.</div>
<div> </div>
<div>No caso do CPF, o DV módulo 11 corresponde ao resto da divisão por 11 do somatório da multiplicação de cada algarismo da base respectivamente por 9, 8, 7, 6, 5, 4, 3 e 2, a partir do dígito mais à esquerda. O resto 10 é considerado como valor 0. </div>
<div> </div>
<div>O nono dígito indica a região fiscal do documento &#8211; ou seja, o estado emissor. As regiões fiscais onde o CPF é emitido tem os seguintes valores:</div>
<div> </div>
<div>
<table style="border-collapse: collapse; width: 47.3094%; height: 303px;" border="1">
<thead>
<tr>
<td style="width: 69.5364%; text-align: center;"><strong>Estado Emissor</strong></td>
<td style="width: 30.4636%; text-align: center;"><strong>Dígito</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 69.5364%; text-align: center;">DF, GO, MS, MT e TO</td>
<td style="width: 30.4636%; text-align: center;">1</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">AC, AM, AP, PA, RO e RR</td>
<td style="width: 30.4636%; text-align: center;">2</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">CE, MA e PI</td>
<td style="width: 30.4636%; text-align: center;">3</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">AL, PB, PE e RN</td>
<td style="width: 30.4636%; text-align: center;">4</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">BA e SE</td>
<td style="width: 30.4636%; text-align: center;">5</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">MG</td>
<td style="width: 30.4636%; text-align: center;">6</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">ES e RJ</td>
<td style="width: 30.4636%; text-align: center;">7</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">SP</td>
<td style="width: 30.4636%; text-align: center;">8</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">PR e SC</td>
<td style="width: 30.4636%; text-align: center;">9</td>
</tr>
<tr>
<td style="width: 69.5364%; text-align: center;">RS</td>
<td style="width: 30.4636%; text-align: center;">0</td>
</tr>
</tbody>
</table>
</div>
<div> </div>
<h3>Como calcular os dígitos verificadores do CPF: Exemplo</h3>
<div>Vejamos como realizar o cálculo dos dois dígitos verificadores de CPF por meio de um exemplo. Suponhamos o CPF de número 667.556.317-36. Note que esse CPF foi emitido em um dos estados: Rio de Janeiro ou Espírito Santo, pois o nono dígito é o 7 (último dígito antes do traço separador). Mas como verificar se ele é válido?</div>
<div> </div>
<div>Para isso temos de efetuar a validação dos dígitos verificadores &#8211; no caso 3 e 6. Vamos ao processo:</div>
<div> </div>
<h4><strong>Passo 1 &#8211; Calcular DV1:</strong></h4>
<div>Vamos primeiramente calcular o dígito verificador #1.<br />
Precisamos usar os nove primeiros dígitos do CPF para isso:</div>
<div> </div>
<div>
<table style="border-collapse: collapse; width: 62.7364%; height: 23px;" border="1">
<tbody>
<tr>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>1</strong></span></td>
<td style="width: 11.1111%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
</tr>
</tbody>
</table>
</div>
<div> </div>
<div>Multiplicamos os dígitos pela sequência decremental de 10 a 2</div>
<div> </div>
<div>
<table style="border-collapse: collapse; width: 70.5228%; height: 28px;" border="1">
<tbody>
<tr>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>1</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 10%; text-align: center;"><em><span style="color: #008000;"><strong>x</strong></span></em></td>
</tr>
<tr>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>10</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>9</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>8</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>4</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>2</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #008000;"><strong>=</strong></span></td>
</tr>
<tr>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>60</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>54</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>56</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>35</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>30</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>30</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>12</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>14</strong></span></td>
<td style="width: 10%; text-align: center;"> </td>
</tr>
</tbody>
</table>
</div>
<div> </div>
<div>Efetuamos o somatório dos valores obtidos para cada dígito multiplicado:</div>
<div>
<p style="text-align: center;"><strong>60 + 54 + 56 + 35 + 30 + 30 + 12 + 3 + 14 = <span style="color: #800000;">294</span></strong></p>
<p>Calculamos o módulo de 11 do resultado (resto da divisão inteira do resultado por 11):</p>
<p style="text-align: center;"><strong>294 % 11 = <span style="color: #800000;">8</span></strong></p>
<p>Finalmente, subtraímos esse módulo de 11: 11 &#8211; 8 = 3</p>
<p style="text-align: center;">Assim, <span style="color: #ff0000;"><strong>3</strong></span> é o dígito verificador 1 (DV1).</p>
</div>
<h4>Passo 2 &#8211; Calcular DV2:</h4>
<div>Vamos agora calcular o dígito verificador #2. Precisamos usar os nove primeiros dígitos do CPF mais o DV1 calculado no passo anterior para isso:</div>
<div> </div>
<div>
<table style="border-collapse: collapse; width: 76.4182%; height: 21px;" border="1">
<tbody>
<tr>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>1</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 10%; text-align: center;"><span style="color: #800000;"><strong>3</strong></span></td>
</tr>
</tbody>
</table>
</div>
<div> </div>
<div>Multiplicamos os dígitos (incluindo o DV1) pela sequência decremental de 11 a 2:</div>
<div> </div>
<div>
<table style="border-collapse: collapse; width: 80.5339%; height: 72px;" border="1">
<tbody>
<tr style="height: 24px;">
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>1</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 5%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 5%; text-align: center; height: 24px;"><span style="color: #ff0000;"><strong>x</strong></span></td>
</tr>
<tr style="height: 24px;">
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>11</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>10</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>9</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>8</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>7</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>5</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>4</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>3</strong></span></td>
<td style="width: 5%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>2</strong></span></td>
<td style="width: 5%; text-align: center; height: 24px;"><span style="color: #ff0000;"><strong>=</strong></span></td>
</tr>
<tr style="height: 24px;">
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>66</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>60</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>63</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>40</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>35</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>36</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>15</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>4</strong></span></td>
<td style="width: 10%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>21</strong></span></td>
<td style="width: 5%; text-align: center; height: 24px;"><span style="color: #800000;"><strong>6</strong></span></td>
<td style="width: 5%; text-align: center; height: 24px;"> </td>
</tr>
</tbody>
</table>
</div>
<div> </div>
<div>
<div>Efetuamos o somatório dos valores obtidos para cada dígito multiplicado:</div>
<div>
<p style="text-align: center;"><strong>66 + 60 + 63 + 40 + 35 + 36 + 15 + 4 + 21 + 6 = <span style="color: #800000;">346</span></strong></p>
<p>Calculamos o módulo de 11 do resultado (resto da divisão inteira do resultado por 11):</p>
<p style="text-align: center;"><strong>346 % 11 = <span style="color: #800000;">5</span></strong></p>
<p>Finalmente, subtraímos esse módulo de 11: 11 &#8211; 5 = 6</p>
<p style="text-align: center;">Assim, <span style="color: #ff0000;"><strong>6</strong></span> é o dígito verificador 2 (DV2).</p>
</div>
</div>
<div style="text-align: center;"><span style="color: #ff6600; font-size: 18pt;"><em><strong>CPF validado.</strong></em></span></div>
<div> </div>
<div>Excelente. Agora que sabemos como realizar essa verificação manualmente, vamos escrever um algoritmo usando lógica de programação e o software Portugol Studio para executar essa tarefa de forma automatizada para nós.</div>
<div> </div>
<h3>Algoritmo em Portugol para calcular o dígito verificador de um CPF     </h3>
<div>Neste exemplo, o algoritmo solicita ao usuário que digite os 9 primeiros dígitos do CPF. Em seguida, é chamada a função ValidaCPF para verificar se o CPF é válido ou não, com base no cálculo dos dígitos verificadores. Caso seja válido, é exibida a mensagem &#8220;CPF válido!&#8221;; caso contrário, é exibida a mensagem &#8220;CPF inválido!&#8221;.</div>
<div> </div>
<div><em>CÓDIGO NO PORTUGOL STUDIO</em></div>
<pre><strong>programa
{

inclua biblioteca Texto --&gt; t
inclua biblioteca Tipos --&gt; ti
cadeia cpf
inteiro cpf_digitos[11]
inteiro digito1, digito2
logico res = falso

funcao inicio()
{

  escreva("Digite o CPF: ")
  leia(cpf)

  para (inteiro i = 0; i &lt; 11; i++) {
    cpf_digitos[i] = ti.caracter_para_inteiro(t.obter_caracter(cpf, i))
  }

  res = ValidaCPF(cpf_digitos)

  se  (res == verdadeiro) {
    escreva("CPF válido!")
  }
  senao {
    escreva("CPF inválido!")
  }

}

  funcao logico ValidaCPF(inteiro num[]) {
    inteiro i, j, soma, resto, dv1, dv2

 <span style="color: #339966;">   // Dígito verificador #1</span>
    soma = 0
    j = 10

    para (i = 0; i &lt; 9; i++) {
      soma += num[i] * j
      j -= 1
    }

    resto = soma % 11

    se (resto &lt; 2) {
      dv1 = 0
    }
    senao {
      dv1 = 11 - resto
    }

    <span style="color: #339966;">// Dígito verificador #2</span>
    soma = 0
    j = 11

    para (i = 0; i &lt; 10; i++) {
      soma += (num[i]) * j
      j -= 1
    }

    resto = soma % 11

    se (resto &lt; 2) {
      dv2 = 0
    }
    senao {
      dv2 = 11 - resto
    }

    se ((num[9] == dv1) e (num[10] == dv2)) {
      retorne verdadeiro
    }
    senao {
      retorne falso
    }

  }

}</strong></pre>
<div>
<div>
<h3>Funcionamento do código do algoritmo de cálculo do dígito verificador do CPF</h3>
</div>
<div><strong>1. Declaração das variáveis:</strong></div>
<div> </div>
<div>O programa começa com a declaração de variáveis e a inclusão das bibliotecas necessárias. As variáveis são:</div>
<ul>
<li>cpf: Variável que armazena o CPF informado pelo usuário para validação, no formato de cadeia de caracteres.</li>
<li>cpf_digitos[11]: Vetor de 11 caracteres para armazenar os dígitos individuais do CPF.</li>
<li>digito1 e digito2: Variáveis inteiras para armazenar os dígitos verificadores calculados.</li>
<li>res: Variável do tipo lógico que armazena o resultado da validação.</li>
</ul>
<div>Também são usadas as bibliotecas Texto e Tipos para realizar conversão de tipos e extração de caracteres da string informada para o vetor.</div>
<div> </div>
</div>
<div><strong>2. Corpo principal do programa</strong></div>
<ol style="list-style-type: lower-alpha;">
<li>Dentro da função <em>inicio()</em>, o programa solicita ao usuário que digite o CPF e lê o valor digitado, armazenando-o na a variável cpf.</li>
<li>Em seguida, o programa percorre cada caractere do CPF digitado e os converte para números inteiros, armazenando-os no array cpf_digitos.</li>
<li>O programa então chama a função ValidaCPF passando o array cpf_digitos como argumento, e armazena o resultado retornado na variável booleana res.</li>
<li>O programa verifica se res é verdadeiro, ou seja, se a função ValidaCPF retornou verdadeiro. Se sim, imprime a mensagem &#8220;CPF válido!&#8221;. Caso contrário, imprime a mensagem &#8220;CPF inválido!&#8221;.</li>
</ol>
<div><strong>3. Definição da função ValidarCPF</strong></div>
<div>
<div> </div>
<div>Esta é a função que efetivamente realiza a validação do CPF. Dentro da função ValidaCPF, são declaradas as variáveis necessárias para realizar a validação dos dígitos verificadores: i, j, soma, resto, dv1 e dv2.</div>
<div> </div>
<div>A função recebe o vetor cpf_digitos na forma de parâmetro num[] e retorna um valor lógico indicando se o CPF é válido ou não.</div>
<div>Ela realiza o cálculo dos dígitos verificadores do CPF seguindo as regras estabelecidas anteriormente:</div>
<div> </div>
<div><em>1. Para calcular o primeiro dígito verificador:</em></div>
<ul>
<li>O programa realiza o cálculo do primeiro dígito verificador utilizando a fórmula de validação do CPF. Ele itera sobre os primeiros 9 dígitos do CPF, multiplicando cada um deles pela sequência decrescente de 10 a 2 e somando o resultado na variável soma. </li>
<li>O resultado é dividido por 11 e obtém-se o resto da divisão.</li>
<li>Se o resto for menor que 2, o primeiro dígito verificador é 0. Caso contrário, é calculado realizando-se 11 menos o resto obtido.</li>
</ul>
<div><em>2. Calcular o segundo dígito verificador:</em></div>
<ul>
<li>O programa repete o mesmo processo para calcular o segundo dígito verificador, agora considerando os primeiros 10 dígitos do CPF. A multiplicação agora é pela sequência decrescente de 11 a 2.</li>
<li>O resultado é dividido por 11 e obtém-se novamente o resto da divisão.</li>
<li>Se o resto for menor que 2, o segundo dígito verificador é 0. Caso contrário, é calculado como 11 menos o resto obtido.</li>
</ul>
<div>Por fim, a função compara os dígitos verificadores calculados com os dígitos verificadores fornecidos no CPF e retorna verdadeiro se forem iguais, ou falso caso contrário.</div>
<div> </div>
<div>O valor retornado pela função ValidaCPF será utilizado no programa principal para determinar se o CPF é válido ou inválido, e exibir a mensagem correspondente.</div>
<div> </div>
<div>É isso aí! Com este algoritmo podemos realizar o cálculo dos dígitos verificadores de um número de CPF para fins de validação. Experimente reescrever esse algoritmo em sua linguagem de programação favorita, como C#, Python ou Java, por exemplo.</div>
</div>
<p>E se preferir, assista a um vídeo da Bóson Treinamentos onde explico como implementar esse algoritmo para testes:</p>
<p><iframe loading="lazy" title="YouTube video player" src="https://www.youtube.com/embed/wmLLw3SnPfc?si=XLI_kYCbhOIw-T2N" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>O post <a href="https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-validacao-de-cpf-digitos-verificadores-logica-de-programacao/">Algoritmo para validação de CPF (dígitos verificadores) &#8211; Lógica de Programação</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/logica-de-programacao/algoritmo-para-validacao-de-cpf-digitos-verificadores-logica-de-programacao/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
