1 重復數字檢查(4分)
題目內容:
從鍵盤輸入一個數,檢查這個數中是否有重復出現的數字。如果這個數中有重復出現的數字,則顯示“Repeated digit!”;否則顯示“No repeated digit!”。
已知函數原型:
int CountRepeatNum(int count[], int n);
若有重復數字,則該函數返回重復出現的數字;否則返回-1.
#define N 100
int CountRepeatNum(int count[], int n);
int main()
{
long n;
int count = 0, temp, result, a[N];
printf("Input n:\n");
scanf("%ld", &n);
while (n != 0)
{
temp = n % 10;
a[count] = temp;
n = n / 10;
count++;
}
result = CountRepeatNum(a,count);
if(result == -1)
{
printf("No repeated digit!\n");
}
else
{
printf("Repeated digit!\n");
}
return 0;
}
int CountRepeatNum(int count[], int n)
{
int flag = -1;
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
if(count[i] == count[j])
{
flag = count[j];
return flag;
}
}
}
return flag;
}
2 教授的課(4分)
題目內容:
教授正在為一個有N個學生的班級講授離散數學課。他對某些學生缺乏紀律性很不滿意,於是決定:如果課程開始后上課的人數小於K,就取消這門課程。從鍵盤輸入每個學生的到達時間,請編程確定該課程是否被取消。如果該門課程被取消,則輸出“Yes”,否則輸出“No”。假設教授在時刻0開始上課。如果一個學生的到達時間是非正整數,則表示該學生在上課前進入教室。如果一個學生的到達時間是正整數,則表示該學生在上課后進入教室。如果一個學生在時刻0進入教室,也被認為是在上課前進入教室。假設到達時間的絕對值不超過100,學生數N不超過1000。要求在輸入學生的到達時間之前,先輸入N和K。
已知函數原型:
//函數功能:根據數組a中記錄的學生到達時間確定課程是否被取消,取消則返回1,否則返回0
int IsCancel(int a[], int n, int k);
#define N 1000
int IsCancel(int a[], int n, int k);
int main()
{
int k, n, result, a[N];
printf("Input n,k:\n");
scanf("%d,%d", &n, &k);
result = IsCancel(a, n, k);
if(result)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
int IsCancel(int a[], int n, int k)
{
int count = 0;
for (int i = 0; i < n; ++i)
{
scanf("%d", &a[i]);
if(a[i] <= 0)
{
count++;
}
}
if(count < k)
{
return 1;
}
else
{
return 0;
}
}
3 尋找鞍點(4分)
題目內容:
請編程找出一個M*N矩陣中的鞍點,即該位置上的元素是該行上的最大值,是該列上的最小值。如果矩陣中沒有鞍點,則輸出“No saddle point!”
已知函數原型:
void FindSaddlePoint(int a[][N], int m, int n);
在該函數中輸出有無鞍點的信息
#define N 10
void FindSaddlePoint(int a[][N], int m, int n);
int main()
{
int m, n, a[N][N];
printf("Input m,n:\n");
scanf("%d,%d", &m, &n);
FindSaddlePoint(a, m, n);
return 0;
}
//按行搜索找最大值,然后判斷該列是否是最小值
void FindSaddlePoint(int a[][N], int m, int n)
{
int max, min, x, y, z, flag = 0;
printf("Input matrix:\n");
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
scanf("%d", &a[i][j]);
}
}
for (int i = 0; i < m; ++i)
{
x = z = i;
y = 0;
max = a[x][y];
for (int j = 0; j < n; ++j)
{
//找先行最大值的坐標
if(a[i][j] > max)
{
max = a[i][j];
//記錄最大值的坐標
x = i;
y = j;
}
}
//最小值等於行的最大值
min = max;
//按列查找最小值
for (int k = 0; k < m; ++k)
{
if(a[k][y] < min)
{
min = a[k][y];
z = k;
}
}
//坐標要相等
if(x == z)
{
flag = 1;
break;
}
}
if(flag)
{
printf("a[%d][%d] is %d\n", x, y, a[x][y]);
}
else
{
printf("No saddle point!\n");
}
}
4 計算三位階乘和數(4分)
題目內容:
試求出所有三位階乘和數:m=a!+b!+c!(其中a為百位數字,b為十位數字,c為個位數字。約定0!=1,並輸出所有的m)
輸入格式: 無
輸出格式:"%ld\n"
int Func(int n);
int main()
{
int a, b, c;
long m;
for (m = 100; m < 1000; ++m)
{
a = m / 100;
b = m / 10 % 10;
c = m % 10;
if(m == Func(a) + Func(b) + Func(c))
{
printf("%ld\n", m);
}
}
return 0;
}
int Func(int n)
{
if(n < 1)
{
return 1;
}
return n * Func(n - 1);
}