<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Verbot einer Potenz]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benötige als bedingung für if</p>
<p>daß p2 nicht Potenz sein darf von p1.</p>
<p>Wie kann man das formulieren. Wenn es nur um das Quadrat ginge, wäre es kein Problem.</p>
<p>Wenn P1=7 darf P2 nicht die Werte 47, 343 etc. annehmen.</p>
<p>Danke für den Tip</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267731/verbot-einer-potenz</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 07:51:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267731.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 May 2010 10:13:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 10:13:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benötige als bedingung für if</p>
<p>daß p2 nicht Potenz sein darf von p1.</p>
<p>Wie kann man das formulieren. Wenn es nur um das Quadrat ginge, wäre es kein Problem.</p>
<p>Wenn P1=7 darf P2 nicht die Werte 47, 343 etc. annehmen.</p>
<p>Danke für den Tip</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904035</guid><dc:creator><![CDATA[Bekell]]></dc:creator><pubDate>Sat, 29 May 2010 10:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 10:31:41 GMT]]></title><description><![CDATA[\begin{align}  
p\_1^x &= p\_2 \\  
x &= \log_{p\_1} p\_2 \\  
x &= \frac{\ln p\_2}{\ln p\_1}  
\end{align}
<p>Prüfen ob Gl. (3) eine natürliche Zahl ist.<br />
Lieber nochmal überprüfen. Logarithmen waren nie meine Stärke:)</p>
<p>Ansonsten ist das eher was fürs 'Rund um die Programmierung' oder Mathematik forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904042</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 29 May 2010 10:31:41 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 10:41:21 GMT]]></title><description><![CDATA[<p>Ist P2 eine (natürlich ganzzahlige) Potenz von P1, so heisst das, dass das Verhältnis des Logarithmus von P2 zum Logarithmus von P1 ganzzahlig ist.</p>
<pre><code>p2 = p1^n // n e N
log(p2) = log( p1^n ) = n * log(p1)
bzw.:
n = log(p2) / log(p1)
</code></pre>
<p>in Code gegossen:</p>
<pre><code class="language-cpp">#include &lt;cassert&gt;
#include &lt;cmath&gt;
#include &lt;iostream&gt;

bool ist_potenz_von( int x, int base )
{
    assert( x &gt; 0 &amp;&amp; base &gt; 0 );
    if( base == 1 )
        return x == 1; // 1^egal == x nur für x==1
    using namespace std;
    const double ex = log( double( x ) ) / log( double( base ) );
    return ex == floor( ex );
}

int main()
{
    using namespace std;
    const int p1 = 7;
    for( int p2; cin &gt;&gt; p2; )
    {
        if( ist_potenz_von( p2, p1 ) )
            cout &lt;&lt; &quot;p2=&quot; &lt;&lt; p2 &lt;&lt; &quot; ist Potenz von &quot; &lt;&lt; p1 &lt;&lt; endl;
        else
            cout &lt;&lt; &quot;p2=&quot; &lt;&lt; p2 &lt;&lt; &quot; ist KEINE Potenz von &quot; &lt;&lt; p1 &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>Ergibt z.B.:</p>
<pre><code>5
p2=5 ist KEINE Potenz von 7
7
p2=7 ist Potenz von 7
1
p2=1 ist Potenz von 7
49
p2=49 ist Potenz von 7
343
p2=343 ist Potenz von 7
344
p2=344 ist KEINE Potenz von 7
342
p2=342 ist KEINE Potenz von 7
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904045</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 29 May 2010 10:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 10:45:14 GMT]]></title><description><![CDATA[<p>Das Problem mit Floating-Point-Lösungen ist, dass man mit ungenauen Datentypen rechnet. Werners Lösung liefert mir beispielsweise für 16807 = 7^5 und 282475249 = 7^10 falsche Ergebnisse aufgrund des Rundungsfehlers.</p>
<p>Mit einem Epsilon-Vergleich kann man sich wohl behelfen, aber die Wahl des Epsilons scheint mir nicht trivial.</p>
<p>Ich nehme an, dass eine Low-Tech-Lösung für Integer gesucht ist, beispielsweise</p>
<pre><code class="language-cpp">bool is_power_of_aux(int x, int base) {
  return x == 1 || (x % base == 0 &amp;&amp; is_power_of(x / base, base));
}

bool is_power_of(int x, int base) {
  if(base == 0) {
    return x == 0 || x == 1;
  }

  return is_power_of_aux(x, base);
}
</code></pre>
<p>Auch wenn das eine deutlich schlechtere Laufzeitkomplexität hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904048</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 29 May 2010 10:45:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 11:06:37 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Das Problem mit Floating-Point-Lösungen ist, dass man mit ungenauen Datentypen rechnet.</p>
</blockquote>
<p>.. kaum hatte ich mein Posting draußen, schon kam mir der gleiche Gedanke.</p>
<p>Ich denke, die Lösung von seldon ist in der Praxis die bessere. Das muss noch nicht mal langsamer sein.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904053</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 29 May 2010 11:06:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 15:12:25 GMT]]></title><description><![CDATA[<p>Danke Leute, ich muß das jetzt erst verarbeiten...<br />
Eine Low Integer Lösung war gesucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904135</guid><dc:creator><![CDATA[Bekell]]></dc:creator><pubDate>Sat, 29 May 2010 15:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 15:35:39 GMT]]></title><description><![CDATA[<p>Nachtrag: Ich meine natürlich</p>
<pre><code class="language-cpp">bool is_power_of_aux(int x, int base) {
  return x == 1 || (x % base == 0 &amp;&amp; is_power_of_aux(x / base, base));
}
</code></pre>
<p>...sonst könnte ich mir das Aussieben von base == 0 auch sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904141</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 29 May 2010 15:35:39 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 15:52:29 GMT]]></title><description><![CDATA[<p>Eine vermutlich deutlich schnellere Implementation ist diese hier, da die teure Division vermieden wird:</p>
<pre><code class="language-cpp">bool is_power_of_aux(int x, int base)
{
  if (x==1)return true;
  int rb=base;
  while (rb&lt;x)rb*=base;
  return rb==x;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1904147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904147</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 29 May 2010 15:52:29 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 15:53:52 GMT]]></title><description><![CDATA[<p>Du müsstest allerdings die Beträge vergleichen oder negative Basen verbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904149</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 29 May 2010 15:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 16:37:57 GMT]]></title><description><![CDATA[<p>Das ist gut.<br />
Noch ein paar Sprzialfälle abchecken.</p>
<pre><code class="language-cpp">bool is_power_of(unsigned int x, unsigned int base){
  switch(base){
    case 0: return x&lt;2;//annahme, 0 hoch 0 == 1
    case 1: return x==1;
    case 2: return x!=0 &amp;&amp; (x&amp;(x-1))==0;
    case 3: //???
    case 4: unsigned int t=x&amp;0x55555555; return x!=0 &amp;&amp; (t&amp;(t-1))==0;
    case 8: siehe case 4
    default: return is_power_of_aux(x,base);
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1904185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904185</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 29 May 2010 16:37:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verbot einer Potenz on Sat, 29 May 2010 18:23:53 GMT]]></title><description><![CDATA[<p>Vielleicht mag für die Basen&lt;256 eine Tabelle anlegen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;map&gt;
using namespace std;

int main(){
	map&lt;unsigned int,unsigned int&gt; powerToBase;
	for(unsigned int base=2;base&lt;256;++base){
		for(unsigned int op=0,power=base;power&gt;op;op=power,power*=base){
			powerToBase[power]=base;
		}
	}
	cout&lt;&lt;powerToBase.size()&lt;&lt;'\n';
}
</code></pre>
<p>Sind nur 1360 Einträge. 256 kleine Arrays für binary_search? Oder eine dicke Hashtable? 256 kleine Hashtables?<br />
Zuerst x==1 und x==base abchecken.<br />
Wenn die Basis größer als 65535 ist, reicht return x=base<em>base.<br />
Wenn die Basis größer als 1625 ist, reicht return x=base*base || x=base*base</em>base.<br />
Wenn sie größer als 256 ist, reichts bis hoch 4 zu testen.</p>
<p>Übrigens ist</p>
<pre><code class="language-cpp">while (rb&lt;x)
</code></pre>
<p>evtl gefährdet durch Überläufe.</p>
<p>Oder vielleicht nur sowas</p>
<pre><code class="language-cpp">bool is_power(unsigned int x,unsigned int base){
	if(x&lt;=1)
		if(x==0) 
			return base==0;
		else
			return base&lt;=1;
	unsigned int op;
	unsigned int power=base;
	do{
		if(power==x)
			return true;
		op=power;
		power*=base;
	}while(power&gt;op);
	return false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1904224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904224</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 29 May 2010 18:23:53 GMT</pubDate></item></channel></rss>