1. 程式人生 > >《C語言程式設計》作業4-迴圈結構2

《C語言程式設計》作業4-迴圈結構2

1057 XTU方陣

1、 題目分析

這是一個比較典型的圖形輸出題目,在期末考試中必定會考一道這種型別的圖形輸出題,對於圖形輸出題目,往往都是通過尋找圖形構造的規律來實現輸出。在此題中,可以發現以下規律,當n=1時,圖形共3(13)行,每行1(與n相等)個xtu;當n=2時,圖形共6(23)行,每行2(n)個xtu;由此,可以發現規律,輸入一個n,就會有3*n行輸出,每行n個xtu。找出規律以後,用程式碼實現輸出就好了。別忘記圖形之間有一個空行哦。

2、參考程式碼

#include<stdio.h>
int main()
{
    int i,j,n,k=1;  //k用來記錄圖形是第幾個,便於進行輸出Case
    while(scanf("%d",&n)!=EOF)    //實現多樣例
    {
        if(n==0) break; //0是輸入結束標誌
        printf("Case %d:\n",k);   //圖形要求有case的輸出
        for(i=0;i<3*n;i++)   //控制行,共有3*n行
        {
            for(j=0;j<n;j++) //控制每行有幾個xtu,每行共n個xtu
            {
                printf("XTU");
            }
            printf("\n"); //輸出一行就要換行
        }
        printf("\n"); //圖形之間有一個空行別忘記了
        k++; //圖形是第幾個的計數器
    }
    return 0;
}

1077 數字塔

1、 題目分析

這個題也是一個圖形輸出題,主要也是找規律。我們用i表示行數,用j表示列數,括號裡是在解釋數字內在規律。當輸出一個n以後。n=2時: 圖形共有2(與n相同)行,第1(i=1)行有1(n-i)個空格,輸出1(與i相同)個1,第2(i=2)行有0(n-i)個空格,輸出3(2i-1)個2; 當n=3時 圖形共有3(與n相同)行,第1(i=1)行有2(n-i)個空格,輸出1(2i-1)個1(與i相同),第2(i=2)行有1(n-i)個空格,輸出3(2i-1)個2(與i相同),第3(i=3)行有0(n-i)個空格,輸出了5(2i-1)個3(與i相同).

2、參考程式碼

#include<stdio.h>
int main()
{
	int i,j,k,m,n;
	k=1;
	while(scanf("%d",&n)!=EOF) //多樣例的輸入 
	{
		if(n==0) break; //n為0時需要結束 
		printf("case %d:\n",k); //圖形是第幾個 
		for(i=1;i<=n;i++) //控制行數 
		{ 
		 	for(j=1;j<=n-i;j++) //圖形空格的規律 
			{
				printf(" ");
			} 
			for(j=1;j<=2*i-1;j++) //圖形輸出的每行內容的規律 
			{
				printf("%d",i);
			} 
			printf("\n"); //輸出完一行就得記得換行 
		}
		k++;
	}
	return 0;
}

1078 字母三角形

1、 題目分析

這個題是一個標準的圖形輸出題,解答此類題往往都是需要通過採取尋找規律的方式,在找到規律後,我們常常可以採取依次輸出的方式來解決問題。在這個題目中,每行可以先考慮輸出前半部分,即輸出由字母’A’到輸入的字母。再考慮每行輸入由輸入的字母到“A”.這是一種比較實用的技巧,即分而治之,一點點完成,一點點考慮。

2、參考程式碼

#include<stdio.h>
int main()
{
    int i,j,k,m,n;
    m=1;       //記錄圖形是第幾個 
    char a,c;
    while(scanf(" %c",&c)!=EOF&&c!='#')  //多樣例輸入且不為 # 
    {
        printf("case %d:\n",m); //輸出圖形是第幾個 
        k=c-64;                 //由規律可知行的數目等於字母在字母表中的位置(第幾個字母) 
        for(i=k;i>=1;i--)
        {
            for(j=0;j<k-i;j++) //空格輸出 
            {
                printf(" ");
            }
            for(a='A';a<='A'+i-1;a++) //先輸出從‘A’到c所代表字母的部分 
            {
                printf("%c",a);
            }
            for(a=a-2;a>='A';a--)   //再輸出從c所代表的字母到‘A’的部分 
            {
                printf("%c",a);
            }
            printf("\n");        //輸完一行就換個行 
        }
        m++; 
    }
    return 0;
}

1112 三點共線

1、 題目分析

高中數學知識的考察,判斷三點共線的方法可以用向量的思考方式,但是為了避免出現分母為0的情況,我們將除變為乘好了。

2、參考程式碼

#include<stdio.h>
int main()
{
	int x[3];
	int y[3];
	int n;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d %d",&x[0],&y[0]);
		scanf("%d %d",&x[1],&y[1]);
		scanf("%d %d",&x[2],&y[2]);
		if((y[1]-y[0])*(x[2]-x[0])==(y[2]-y[0])*(x[1]-x[0]))
		{
			printf("Yes\n");
		}
		else
		{
			printf("No\n");
		}
	}
	return 0;
}

1113 區間相交

1、 題目分析

在判斷區間相交的時候,細細分析一下可知,【a,b】與【c,d】不相交的時候必然有c>b或者a>d;其餘情況則必為相交的情況。

2、參考程式碼

#include<stdio.h>
int main()
{
	int x[2],y[2];
	int n;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d %d",&x[0],&y[0]);
		scanf("%d %d",&x[1],&y[1]);
		if((x[1]>y[0])||(x[0]>y[1]))
		{
			printf("No\n");
		}
		else
		{
			printf("Yes\n");
		}
	}
	return 0;
}

1118 方程的根

1、 題目分析

這個題目的話難度不是很大,主要就是考察了我們高中數學裡函式係數分類討論的知識,做題的時候需要注意的就是儘量要把所有的情況都得考慮進去,否則就會因為不嚴謹而出錯。

2、參考程式碼

#include<stdio.h>
int main()
{
	int k,m,a,b,c;
	scanf("%d",&k);
	while(k--)
	{
		scanf("%d %d %d",&a,&b,&c);
		if(a==0)  
		{
			if(b==0)   //常數函式 
			{
				if(c==0)  //a,b,c均為0時有無窮個解 
				{
					printf("INF\n");
				}
				else     //a,b為0而c不為0則沒有解 
				{
				    printf("0\n");
				}
			}
			else //一元一次函式僅有一個解 
			{
				printf("1\n"); 
			}
		}
		else    //一元二次函式 
		{
			m=b*b-4*a*c; //計算表示式
			if(m>0)  printf("2\n"); 
			else if(m==0)   printf("1\n"); 
			else  printf("0\n"); 
		} 
	}
	return 0;
}

1189 Root

1、 題目分析

對這個題目來說,它的難度相對較大,難處就在於很容易缺少考慮某些情況,但是隻要始終把握好計算過程中分母不為0和且最終解必須為非負整數這兩點去做就好了。不然可能就會出錯,僅僅就是因為自己缺少考慮了一些特殊的情況。

2、參考程式碼

#include<stdio.h>
int main()
{
    int k,a,b,c,r,m,n,d,x;
    scanf("%d",&k);
    while(k--)
    {
        scanf("%d %d %d",&a,&b,&c);
        m=a-b*c;
        n=c-1;
        if(c==0) 
        {
            if(a==0&&b!=0)           printf("0\n");
            else                     printf("None\n");
        }
        else if(c==1)
        {
            if(a!=b)            printf("None\n");
            else if(a==0)       printf("1\n");
            else                printf("0\n");
        }
        else 
        {
        d=m*n;
        r=m%n;
        x=m/n;
        if(m==0&&b!=0)            printf("0\n");
        else if(x<0)              printf("None\n");
        else if(r==0)    
        {
            if(x!=(-b)) printf("%d\n",x);
            else        printf("None\n");
        }
        else            printf("None\n");
        }
    }
    return 0;
}

1255 勾股數

1、 題目分析

做這個題目的時候我們首先需要注意的一點就是這是一個三角形,那麼我們三邊就必須要滿足三邊關係,即兩邊之和大於第三邊,通過採取有效區間內的元素搜尋法,可以從小到大依次尋找,當找到一條滿足勾股定理的邊時,就立馬結束搜尋直接輸出,這時找到的邊毫無疑問就是滿足條件的最小邊。

2、參考程式碼

#include<stdio.h>
int main()
{
	int x,y; //接收兩條邊的變數 
	int i,k;
	scanf("%d",&k); //讀入樣例的個數 
	while(k--)
	{
		scanf("%d %d",&x,&y);
		for(i=1;i<x+y;i++)  //區間搜尋法,在x+y內進行搜尋,但不可以為x+y,三角形的三邊關係要求的 
		{
			if((i*i+x*x==y*y)||(i*i+y*y==x*x)||(x*x+y*y==i*i)) //進行判斷,如果邊長滿足條件,那麼就結束搜尋,因為我們要找的是滿足條件的最小邊 
			{
				break;
			}
		}
		if(i==(x+y)) printf("None\n"); //當搜尋結束後如果都沒找到合適的邊,那就意味著不存在合適邊 
		else         printf("%d\n",i); //搜尋到了合適的邊直接輸出好了 
	}
	return 0;
}