C言語に基づく数学的思考の問題

マスター・フンは、C言語は広範で深遠であると信じています。資格のあるプログラマーは、厳密な論理的思考を持ち、MCU、オペレーティングシステム、および非常に高く聞こえるさまざまな業界関連のものに精通しているだけでなく、数学的な思考と鋭い匂いの感覚も持っている必要があります。優れたデバッグ能力。数年のミキシングの後、いくつかの非常に基本的な数学的思考も厳格になっていることがわかりました。たとえば、順列や組み合わせのさまざまな柔軟なアプリケーションなどの不平等は、通常はあまり使用されないかもしれませんが、自由な時間があるので、もっと練習することができます。あなたの頭が硬直しないように、あなた自身のためにもっと考えてください。

質問1:1、2、3、4の数字がありますが、繰り返し番号なしで3桁の数字をいくつ形成できますか?いくつだ?

最初にプログラムを使用せず、タイプの数を計算するだけです。高校での順列と組み合わせを覚えている場合、結果は明らかにA(3,4)、つまり4 3 2 = 24タイプになります。
ここの学生の誰かがこれについて考えましたか?
次に、別の条件を追加すると、24の組み合わせにいくつの異なる組み合わせがありますか?ここでの違いは、無秩序の違いを指します。たとえば、123と321は組み合わせです。
順列と組み合わせの式で計算される4つのタイプがあります。A(3,4)/ A(3,3)= 4;

上記は数学的なアルゴリズムであり、計算の種類はいくつありますか
。C言語プログラムを使用してそれらを配置するのは非常に簡単です。コードは次のとおりです。

#include"stdio.h"
void main()
{
    
    
	int arry[4] = {
    
    1,2,3,4};
	int i = 0,j = 0,k = 0;
	int number = 0;
	for(i = 0;i < 4;i++)
	{
    
    	
		for(j = 0;j < 4;j++)
		{
    
    	
			for(k = 0;k < 4;k++)
			{
    
    
				if((i != j)&&(i != k)&&(j != k)) 
				{
    
    
				printf(" %d ",arry[i]);
				printf(" %d ",arry[j]);
				printf(" %d\n",arry[k]);
				number++;
				}
			}	
		}
	}
	printf("number = %d\n",number);
} 在这里插入代码片

質問2:整数は、100を加算すると完全な二乗数になり、168を加算するともう1つの完全な二乗数になります。その数は何ですか。

一目見てください。誰もが必然的に頭の中で2つの式を形成し
ます:1。x + 100 = n n;
2. x + 100 + 168 = m
m;
次に何をすべきか?明らかに3つの未知数がありますが、2つの方程式しかないため、答えを直接見つけることは確かに不可能です。
ここでは、数学的な不平等のアイデアを使用する必要があります。不平等を作成するための不平等はありません。
次に、m m-n n = 168、mとnの差は1です。 、両者の差が最も小さい。mとnの二乗の差が168より大きい場合、それはmとnの上限であり、枯渇
する可能性があります。同様の方法を使用してそれを知ることもできます。m m + n nの下限は168より大きくなければならないので、nの最小値は1であり、mの最小値は13であることがわかります。これにより、範囲がさらに狭くなります。
コードは次のとおりです。ただし、このコードはそうではありません。下限を求めてください。

int main()
{
    
    
	int m,n,i,j,x;
	for(m = 1,n = 0;m*m- n*n < 169;m++,n++);
	printf("m = %d\n",i = m);
	printf("n = %d\n",j = n);
	for(m=2;m<i+1;m++)
	{
    
    
		for(n=1;n<j+1;n++)
		{
    
    

			if((m*m - n*n) == 168)
			{
    
    
				printf("x = %d\n",n*n - 100);
			}
		}
	}
 } 

上記よりも優れた問題解決ソリューションもあります。コードを投稿します。

int main()
{
    
    
	int i,j,m,n,x,q;
	for(i=2;i<85;i+=2)//由于i在分子部分,所以不能为0.不然直接死机 
	{
    
    
		if(168%i == 0)
		{
    
    
			j = 168/i;
			if(i > j && (i+j) %2 == 0 && (i-j)%2 == 0)
			{
    
    
				m = (i + j)/2;
				n = (i - j)/2;
				q = m*m - n*n;
				if(q == 168)
				{
    
    
					x = n*n - 100;
					printf("x = %d\n",x);
				}
			}
		}
	}
}

最初のソリューションの続き:
1。x+ 100 = n n;
2. x + 100 + 168 = m
m;
3. m m-n n = 168->(m + n)(mn)= 168、 i =(m + n)、j =(mn);次に、iとjの少なくとも1つは偶数です;
4.次に、導出に進みます、m =(i + j)/ 2、n =(ij)/ 2、したがって(I + j)または(ij)は偶数でなければならないので、iとjは偶数または両方とも奇数です。3番目のステップによると、少なくとも1つの偶数があることがわかっているので、iとjは両方とも偶数です
。4。i
j = 168、j = 2の場合、iは最大でなければなりません。したがって、iの最大値は84です
。5。i= 2であることがわかっているので、2からiを使い果たします。そうすれば、j、m、nを確実に見つけることができます。 、x、必要な値を見つけることができます。

OVER。。。。。

おすすめ

転載: blog.csdn.net/qq_27854611/article/details/109587680