1. 程式人生 > >廣工 AnyviewC C語言習題 第七章

廣工 AnyviewC C語言習題 第七章

Anyview 第七章


/**********

【習題7.010】寫一函式求3個整數中最小的數。

**********/

int min(int x, int y, int z)
/* 返回3個整數x,y和z中最小的數 */
{
	int min=x;
	if (y<min)
	{
		min=y;
	}
	if (z<min)
	{
		min=z;
	}
	return min;
}

/**********

【習題7.020】編寫函式,求用1元、5元和10元三種紙幣

支付n元錢共有多少種支付法?
例如,16元可有6種支付方法:
方法 1 2 3 4 5 6
10元 0 0 0 0 1 1
5元 0 1 2 3 0 1
1元 16 11 6 1 6 1
**********/

int change(int n)
{
	int m=0;
	int x=1,i,y=5,j,z=10,k;
	for (i=0;i<=n;i++)
	{
		for (j=0;j<=n;j++)
		{
			for (k=0;k<=n;k++)
			{
				if (i*x+j*y+k*z == n)
				m++;
			}
		}
	}
		return m;
}

int change(int n)
{
	int i,j,k,t=0;
	for (i=0;i<n/10;i++)
	{
		k=(n-i*10)/5;
		for (j=0;j<=k;j++)
		{
		t++
; } } return t; }

/**********

【習題7.030】先編寫一個判斷素數的函式。再編寫一個函式

將一個偶數表示為兩個素數之和,並返回其中較小的素數。
注:素數指只能被1和自身整除的正整數。規定0,1不是素數。
**********/

int prime(int n) 
/* 判斷素數,如果是素數返回1,不是素數則返回0 */
{
		int flag=1,i;
	for (i=2;i<n;i++)
	{
		if (n%i==0)
		{
			flag=0;

			return flag;
		}
	}

	return flag;
}

int f(int
i) /* 將偶數i表示為兩個素數之和,返回其中較小的素數*/ { int max=0,min=0,j,k; for (j=1;j<i;j++) { for (k=1;k<i;k++) { if (prime(j) && prime(k) && j+k==i) { if (j<k) { min=j; max=k; if (min>1) return min; } } } } return min; }

/**********

【習題7.050】編寫函式,將字串中ASCII碼最小的字元

放在第一個字元位置,其餘字元依次往後移。
**********/

void func(char *str)
/* 將字串str中ASCII碼最小的字元放在第一個 */
/* 字元位置,其餘字元依次往後移。           */
{
		int i,t=0;
	char min=str[0];
	int l=strlen(str);
	for (i=0;i<l;i++)
	{
		if(str[i]<min)
		{
			min=str[i];
			t=i;
		}
	}
	if (t)
	for (i=t-1;i>=0;i--)
	{
		str[i+1]=str[i];
	}
	str[0]=min;
}

/**********

【習題7.060】編寫函式將一個nxn的二維陣列按“次對角線”翻轉。

例如:翻轉前的陣列 翻轉後的陣列
1 2 3 9 6 3
4 5 6 —> 8 5 2
7 8 9 7 4 1
**********/

void invert(char a[N][N])
{
	int i,j,k;
	for (i=0;i<N;i++)
	{
		for (j=0;j<N-i;j++)
		{
			k=a[i][j];
			a[i][j]=a[N-1-j][N-1-i];
			a[N-1-j][N-1-i]=k;
		}
	}
}

/**********

【習題7.064】編寫函式將一個NxN的二維陣列“水平”翻轉。

例如:翻轉前的陣列 翻轉後的陣列
1 2 3 7 8 9
4 5 6 —> 4 5 6
7 8 9 1 2 3
**********/

void invertH(char a[N][N])
{
	int i, j;
	char t[N];
	for (i = 0; i < N / 2; i++)
	{
		for (j = 0; j < N; j++)
		{
			t[j] = a[i][j];
			a[i][j] = a[N - 1 - i][j];
			a[N - 1 - i][j] = t[j];
		}
	}
}

/**********

【習題7.065】編寫函式將一個NxN的二維陣列“垂直”翻轉。

例如:翻轉前的陣列 翻轉後的陣列
1 2 3 3 2 1
4 5 6 —> 6 5 4
7 8 9 9 8 7
**********/

void invertV(char a[N][N])
{
	int i, j;
	char t;
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N / 2; j++)
		{
			t = a[i][j];
			a[i][j] = a[i][N - 1 - j];
			a[i][N - 1 - j] = t;
		}
	}
}

/**********

【習題7.067】編寫函式將一個NxN的二維陣列的周邊元素

“順時針”輪轉1位。
例如:輪轉前的陣列 輪轉後的陣列
1 2 3 4 1 2
4 5 6 —> 7 5 3
7 8 9 8 9 6
**********/

void turningClockwise(char a[N][N])
{
	t1 = a[0][N - 1];
	t2 = a[N/2][0];
	t3 = a[N/2][N - 1];
	t4 = a[N-1][0];
	for (i = N-1; i >0; i--)
	{
		a[0][i] = a[0][i-1];
	}
	for (i = 1; i < N ; i++)
	{
		a[N-1][i-1] = a[N-1][i];
	}
	a[0][0] = t2;
	a[1][N - 1] = t1;
	a[N - 1][N - 1] = t3;
	a[N / 2][0] = t4;
}

void turningClockwise(char a[N][N])
{
	int i;
	int float=1;
	int t=a[0][N-1];
	for (i=N;i>0;i--)
		a[0][i]=a[0][i-1];
	for (i=0;i<N;i++)
		a[i][0]=a[N-1][i+1];
	for (i=N-1;i>0;i--)
		a[i][N-1]=a[i-1][N-1];
	a[1][N-1]=t;
}

/**********

【習題7.068】編寫函式將一個NxN的二維陣列的

周邊元素“逆時針”輪轉1位。
例如:輪轉前的陣列 輪轉後的陣列
1 2 3 2 3 6
4 5 6 —> 1 5 9
7 8 9 4 7 8
**********/

void turningAnticlockwise(char a[N][N])
{
	 int i, j;
    char t1,t2,t3,t4;
    t1 = a[0][0];
    t2 = a[N/2][0];
    t3 = a[N/2][N - 1];
    t4 = a[N-1][N-1];
    for (i = 0; i <N-1; i++)
    {
        a[0][i] = a[0][i+1];
    }
    for (i = N-1; i >0 ; i--)
    {
        a[N-1][i] = a[N-1][i-1];
    }
    a[0][N-1] = t3;
    a[N/2][0] = t1;
    a[N/2][N - 1] = t4;
    a[N -1][0] = t2;
}

/**********

【習題7.072】編寫函式將一個NxN的二維陣列a的元素

按行向右輪轉1位。
例如:輪轉前的陣列 輪轉後的陣列
1 2 3 3 1 2
4 5 6 —> 6 4 5
7 8 9 9 7 8
**********/

void turningRight(char a[N][N])
{

}

/**********

【習題7.075】編寫函式將一個NxN的二維陣列a的元素

按行向左輪轉1位。
例如:輪轉前的陣列 輪轉後的陣列
1 2 3 2 3 1
4 5 6 —> 5 6 4
7 8 9 8 9 7
**********/

void turningLeft(char a[N][N])
{

}

/**********

【習題7.082】編寫函式將一個NxN的二維陣列a的元素

按列向下輪轉1位。
例如:輪轉前的陣列 輪轉後的陣列
1 2 3 7 8 9
4 5 6 —> 1 2 3
7 8 9 4 5 6
**********/

void turningDown(char a[N][N])
{

}

/**********

【習題7.085】編寫函式將一個NxN的二維陣列a的元素

按列向上輪轉1位。
例如:輪轉前的陣列 輪轉後的陣列
1 2 3 4 5 6
4 5 6 —> 7 8 9
7 8 9 1 2 3
**********/

void turningUp(char a[N][N])
{

}

/**********

【習題7.103】編寫函式,求整數m和n的最大公約數,

並作為函式的返回值。
**********/

int gdc(int m, int n)
{

}

/**********

【習題7.105】 編寫函式,求整數m和n的最小公倍數,

並作為函式的返回值。
**********/

int lcm(int m, int n)
{

}
#include <stdio.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int prime(int n) 
/* 判斷素數,如果是素數返回1,不是素數則返回0 */
{
	int flag=1,i;
	for (i=2;i<n;i++)
	{
		if (n%i==0)
		{
			flag=0;
			printf("prime=%d\n",flag);
			return flag;
		}
	}
	printf("prime=%d\n",flag);
	return flag;
}

int f(int i)   
/* 將偶數i表示為兩個素數之和,返回其中較小的素數*/
{
	int max=0,min=0,j,k;
	for (j=1,k=1;j<i,j<k;j++,k++)
	{
		if (prime(j) && prime(k) && j+k==i)
		{
			min=j;
			max=k;
		}
		
	}
	printf("f=%d %d\n",min,max);
	return min;
}

int main(int argc, char *argv[]) {
	int a,b,c;
	scanf("%d",&c);
	if (c%2==0)
	{
		f(c);
	}
	prime(c);
	return 0;
}

未完待續……