1. 程式人生 > >來自剛剛進入打卡工作的落後者的練習題——07

來自剛剛進入打卡工作的落後者的練習題——07

這次的打卡要複習以前的知識了,溫故而知新,可以為師矣! (就是為自己做題少找了個理由罷了) 我發現自己很多題都要問別人,以後要進行獨立思考,相信以後我能自己解決問題。加油! 言歸正傳,進入正題。 複習題開始:

第一題:列印楊輝三角(帶優化的)

#include <stdio.h>
int main ()
{
	int i;
	int j;
	int k;
	int n;
	
	scanf ("%d",&n);
	
	for (i=0;i<n;i++)
	{
		for (k=n-i-1;k>0;k--)
	   	{
	   		printf (" ");
	   	}
		for (j=0;j<i+1;j++)
		{
			int sum;
	    	int up=1;
	    	int down=1;
	    	
			if (j==0)
			{
				printf ("1 ");
			}
			else 
			{
				for (k=0;k<j;k++)
				{
					down*=(k+1);
				}
				for (k=i;k>i-j;k--)
         		{
		        	up*=k;
        		}
        		sum=up/down;
        		printf ("%d ",sum);
			}
		}
		printf ("\n");
	}
	return 0;
}

現在輸出的就是等腰三角形了。 基本思路還是用的高中的排列組合的方法,因為楊輝三角的特點就是: 楊輝三角形同時對應於二項式定理的係數.即為高中講的C几几 如果是第4行第3列,這個數是3,這個數的表示式就,32/12即為C3 2 下面就是我的思路(上次沒細說,這次補上)

1、先開始定義的i用來換行 2、後面的j則是代表這個數字是第幾位數字 3、經觀察發現當j=0時,不能進行Ci 0,但是第一列的數字都是1,所以,當j=0時,那麼輸出1,其他的位數就按正常的二項式定理的係數計演算法則進行計算 4、up是代表計算指的是分子上的數 5、down代表的是分母上的數 6、sum就是計算的這個位置上的數值

最後重點就是怎麼用i和j進行位置的判斷了 在這裡插入圖片描述

如圖所示 第5行第4列是4 分母是3的階乘 分子是從4一直階乘到2 所以分母的計算式就有了 down= j! 同時分子的計算式也有 up=i(i-1)*(i-2)…(i-j+1)* 這樣,這個位置上的數也就計算出來了。

之後就是輸出了,輸出的要想是金字塔形的話,就和列印等腰三角形是相似的(一直讓我改,之前是不知道啊,現在總算是知道了)

第二題:查詢座位號 這個題的題目就不詳細寫了,太佔地方了 簡單描述一下題目: 1、輸入學號的個數n,分別輸入n行,每行有三個資料,學號 試機號 考試號 2、輸入查詢考試號的人數,輸入試機號,輸出相應的學號還有考試號

下面是程式碼:

#include <stdio.h>
int main ()
{
	int n;
	
	scanf ("%d",&n);
	
	int i;
	int j;
	int Try[n];
	int test[n];
	long long number[n];
	
	for (i=0;i<n;i++)
	{
		scanf ("%lld",&number[i]);
		scanf ("%d %d",&Try[i],&test[i]);
	}
	
	int m;
	
	scanf ("%d",&m);    //m是要查詢的號人數 
	
	int a[m];     
	
	for (j=0;j<m;j++)
	{
		scanf ("%d",&a[j]);   //n個要查詢的試機號 
	}
	for (j=0;j<m;j++)
	{
		for (i=0;i<n;i++)
		{
			if (a[j]==Try[i])     //當條件符合的時候,進行輸出 
			{
				printf ("%lld %d\n",number[i],test[i]);
			}
		}
	}
	return 0;
}

上次為什麼錯誤,我到現在也不是太清楚,但是,能改正了 之前匹配試機號的程式碼是這樣的

for (i=0;i<n;i++)
	{
		for (j=0;j<m;j++)
		{
			if (Try[i]==a[j])
			{
				printf ("%lld %d\n",number[i],test[i]);
			}
		}
	}

現在匹配試機號的程式碼是這樣的

for (j=0;j<m;j++)
	{
		for (i=0;i<n;i++)
		{
			if (a[j]==Try[i])     //當條件符合的時候,進行輸出 
			{
				printf ("%lld %d\n",number[i],test[i]);
			}
		}
	}

就僅僅是i和j的順序的問題,仔細看了之後,發現要找的東西是num[i]還有test[i],i的迴圈應該放在裡面。 所以之前的邏輯有問題。

就到這裡吧,長了沒人願意仔細看! 我還會繼續努力的,讓那些對我抱有期望的人不失望!