1重复数字检查(4分)
题目内容:
从键盘输入一个数,检查这个数中是否有重复出现的数字。如果这个数中有重复出现的数字,则显示“Repeated digit!”;否则显示“No repeated digit!”。
已知函数原型:
int CountRepeatNum(int count[], int n);
若有重复数字,则该函数返回重复出现的数字;否则返回-1.
程序运行结果示例1:
Input n:
28212↙
Repeated digit!
程序运行结果示例2:
Input n:
12345↙
No repeated digit!
输入提示:"Input n:\n"
输入格式: "%ld"
输出格式:
有重复数字,输出信息: "Repeated digit!\n"
没有重复数字,输出信息: "No repeated digit!\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
#include <stdio.h>
int CountRepeatNum(int a[], int j); /*does it has duplicate figures*/
int main()
{
int a[20], number, result;
int i = 0, j;
printf("Input n:\n");
scanf("%d", &number);
do /*save the number in the a[] one by one*/
{
if ((number/10) == 0)
{
a[i] = number;
break;
}
a[i] = number % 10;
i++;
j = i;
number /= 10;
}while(1);
result = CountRepeatNum(a, j); /*if has duplicate figures, return the figures*/
if (result == -1) /*if not, return -1*/
printf("No repeated digit!\n");
else
printf("Repeated digit!\n");
return 0;
}
int CountRepeatNum(int a[], int j)
{
int i, flag =0;
for (; j > 0; j--)
{
for (i = j-1; i >= 0; i--)
{
if (a[j] == a[i])
flag = 1;
}
}
if (flag == 1)
return a[j];
else
return -1;
}
2
教授的课(4分)
题目内容:
教授正在为一个有N个学生的班级讲授离散数学课。他对某些学生缺乏纪律性很不满意,于是决定:如果课程开始后上课的人数小于K,就取消这门课程。从键盘输入每个学生的到达时间,请编程确定该课程是否被取消。如果该门课程被取消,则输出“Yes”,否则输出“No”。假设教授在时刻0开始上课。如果一个学生的到达时间是非正整数,则表示该学生在上课前进入教室。如果一个学生的到达时间是正整数,则表示该学生在上课后进入教室。如果一个学生在时刻0进入教室,也被认为是在上课前进入教室。假设到达时间的绝对值不超过100,学生数N不超过1000。要求在输入学生的到达时间之前,先输入N和K。
已知函数原型:
//函数功能:根据数组a中记录的学生到达时间确定课程是否被取消,取消则返回1,否则返回0
int IsCancel(int a[], int n, int k);
程序运行结果示例1:
Input n,k:
4,3↙
-1 -3 4 2↙
YES
程序运行结果示例2:
Input n,k:
5,3↙
-1 -2 -3 0 4↙
NO
输入提示:"Input n,k:\n"
输入格式:
"%d,%d"
"%d"
输入包括两行数据:
第1行是n,k的值。
第2行是学生的到达时间。
输出格式:
课程被取消,输出"YES"
课程不取消,输出"NO"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include <stdio.h>
int IsCancel(int a[], int n, int k);
int main()
{
int n, k;
int i, a[1000];
printf("Input n,k:\n");
scanf("%d,%d", &n, &k);
for (i = 0; i <n; i++)
{
scanf("%d", &a[i]);
}
if (IsCancel(a, n, k))
printf("YES");
else
printf("NO");
return 0;
}
int IsCancel(int a[], int n, int k)
{
int count = 0, i;
for (i = 0; i <n; i++)
{
if (a[i] <= 0)
count++;
}
if(count < k)
return 1;
else
return 0;
}
题目内容:
请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!”
已知函数原型:
void FindSaddlePoint(int a[][N], int m, int n);
在该函数中输出有无鞍点的信息。
程序运行结果示例1:
Input m,n:
3,3↙
Input matrix:
1 2 3↙
4 5 6↙
7 8 9↙
a[0][2] is 3
程序运行结果示例2:
Input m,n:
3,4↙
Input matrix:
3 4 7 5↙
0 1 8 2↙
9 3 2 6↙
No saddle point!
输入提示: "Input m,n:\n"
“Input matrix:\n"
输入格式:
输入矩阵大小: "%d,%d"
输入矩阵元素: "%d"
输出格式:
找到鞍点的输出格式:"a[%d][%d] is %d\n"
没找到鞍点的输出格式:"No saddle point!\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
#include <stdio.h>
#define N 20
#define M 20
void FindSaddlePoint(int a[][N], int m, int n);
int main()
{
int m, n, a[M][N];
int i, j;
printf("Input m,n:\n");
/*save data in a[][]*/
scanf("%d,%d", &m, &n);
printf("Input matrix:\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
/*output*/
FindSaddlePoint(a, m, n);
return 0;
}
void FindSaddlePoint(int a[][N], int m, int n)
{
int b[N];
int i, j;
int Min_n;
int flag = 0, count = 0;
for (i = 0; i <m; i++)
{
for (j = 1; j < n; j++)
{
Min_n = 0;
if (a[i][0] < a[i][j])
Min_n = j;
b[i] = Min_n;
}
}
for (i = 0; i < m; i++)
{
/*the max figure in this line is a[i][b[i]]*/
for (j = 0; j < m; j++)
{
if (a[i][b[i]] > a[j][b[i]])
flag = 1;
}
if (flag == 0)
{
printf("a[%d][%d] is %d\n", i, b[i], a[i][b[i]]);
count++;
}
}
if (count == 0)
printf("No saddle point!\n");
}
4
计算三位阶乘和数(4分)
题目内容:
试求出所有三位阶乘和数:m=a!+b!+c!(其中a为百位数字,b为十位数字,c为个位数字。约定0!=1,并输出所有的m)
输入格式: 无
输出格式:"%ld\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include <stdio.h>
long Factorial(long n);
int main()
{
long a, b, c;
long m;
for(m=100;m<1000;m++)
{
a = m / 100;
b = m / 10 % 10;
c = m % 10;
if(Factorial(a) + Factorial(b) + Factorial(c) == m)
{
printf("%ld\n", m);
}
}
return 0;
}
long Factorial(long n)
{
long initial = 1;
int i;
for (i = 2; i <= n; i++)
{
initial *= i;
}
return initial;
}