大師匈覺得C語言博大精深,一個合格的程式員不僅要有嚴密的邏輯思維,精通MCU啊,作業系統啊,各種行業相關的聽起來很高大上的東西,而且要有數學思維,敏銳的嗅覺出色的debug能力,混跡幾年,發現一些很基礎的數學思維竟然也開始僵化了;如不等式,如排列組合的各種靈活應用,可能平時用的少,但是有一些空閑,多練習一些,讓自己多思考一下,不至于讓自己的腦袋逐漸僵化,
第一題:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?
先不用程式實作,直接去算,有多少種,如果你還記得高中的排列組合,那么結果很顯然就是A(3,4),就是432 = 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);
} 在這里插入代碼片
第二題:一個整數,它加上100后是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
第一眼看過去,大家必然會在腦海里形成倆個公式:
1、x+100 = nn;
2、x+100+168 = mm;
接下來我們要怎么算呢?很顯然這有三個未知數,但只有倆個方程式,必然不可能直接求出答案;
這里要利用數學的不等式思想,沒有不等式創造不等式;
那么mm - nn = 168;m和n的相差為1,它倆的差值最小,如果差值為1的m,n的平方相減剛好大于168,那么就是m和n的上限,我們就可以去窮舉了;
我們也可以用類似的辦法知道它的下限,就是mm+nn這倆個肯定大于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 = nn;
2、x+100+168 = mm;
3、mm - nn = 168 -> (m+n)(m-n) = 168 ,我們設i = (m+n),j = (m-n);那么i和j 至少有一個為偶數;
4、然后再進行推導,m = (i+j)/2,n = (i-j)/2,所以(i+j)或者(i-j)必然為偶數,所以i和j要么都是偶數要么都是奇數,我們根據第三步得知,至少有一個偶數,所以i和j都是偶數;
4、ij = 168,如果j = 2,那么i 肯定是最大的;所以 i 的最大值就是84;
5、我們就從2開始窮舉i,知道i = 2,那么必然能求出j,m,n,x,我們就知道 找到我們想要的值;
OVER ,,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/220610.html
標籤:java
