题目内容:
用二分法求下面的一元三次方程在区间[-10, 10]上误差不大于的根。
用二分法求方程的根的基本原理是:若函数有实根,则函数曲线应当在根x*这一点上与x轴有一个交点,并且由于函数是单调的,在根附近的左右区间内,函数值的符号应当相反。利用这一特点,可以通过不断将求根区间二分的方法,每次将求根区间缩小为原来的一半,在新的折半后的区间内继续搜索方程的根,对根所在区间继续二分,直到求出方程的根为止。
该方法的关键在于要解决如下两个问题:
1)如何对区间进行二分,并在二分后的左右两个区间中确定下一次求根搜索的区间?
假设区间端点为x1和x2,则通过计算区间的中点x0,即可将区间[x1, x2]二分为[x1, x0]和[x0, x2]。这时,为了确定下一次求根搜索的区间,必须判断方程的根在哪一个区间内,由上图可知方程的根所在区间的两个端点处的函数值的符号一定是相反的。也就是说,如果f(x0)与f(x1)是异号的,则根一定在左区间[x1, x0]内,否则根一定在右区间[x0, x2]内。
2)如何终止这个搜索过程?即如何确定找到了方程的根?
对根所在区间继续二分,直到,即|f(x0)|≈0时,则认为x0是逼近函数f(x)的根。
程序中所有变量的数据类型均为float。
输入格式: “%f,%f”
输出格式: “x=%6.2f\n”
输入样例:
0,4
输出样例:
x=__1.32
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输出样例中下划线“_”代表空格,本例中数字1的前面有两个空格)
# include
#include
float Fun(float x)
{
return x * x * x - x -1;
}
int main()
{
float high, low, mid;
scanf("%f,%f", &low, &high);
mid = (low + high)/2;
while(fabs(Fun(mid))>=1E-6)
{
if(Fun(mid)*Fun(high)<0)
low = mid;
else
high = mid;
mid = (low + high)/2;
}
printf( "x=%6.2f\n", mid);
return 0;
}
题目内容:
某二维数组存放的数据构成一个nn的方阵,其中n<=5。写程序,从键盘输入n的值(n<=5),该nn矩阵中各元素的值按下面的公式计算:
a[i][j] = i * n + j + 1
其中,a[i][j]表示第i行第j列的元素。要求分别输出该矩阵和它的转置矩阵。
注意:定义数字大小N时,请用
#define N 10
输入格式: “%d”
输出提示:“The original matrix is:\n”
输出提示:“The changed matrix is:\n”
输出格式: 矩阵的列与列之间为%3d,行与行之间为\n
输入样例1:
5↙
输出样例1:
The_original_matrix_is:
__1__2__3__4__5
__6__7__8__9_10
_11_12_13_14_15
_16_17_18_19_20
_21_22_23_24_25
The_changed_matrix_is:
__1__6_11_16_21
__2__7_12_17_22
__3__8_13_18_23
__4__9_14_18_24
__5_10_15_20_25
(输出样例中下划线“_”代表空格)
输入样例2:
4↙
输出样例2:
The original matrix is:
__1__2__3__4
__5__6__7__8
__9_10_11_12
_13_14_15_16
The changed matrix is:
__1__5__9_13
__2__6_10_14
__3__7_11_15
__4__8_12_16
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输出样例中下划线“_”代表空格)
# include
#include
#define N 10
int main()
{
int i, j, n,a[N][N];
scanf("%d", &n);
printf("The original matrix is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]= i*n+j+1;
printf("%3d", a[i][j]);
}
printf("\n");
}
printf("The changed matrix is:\n");
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
return 0;
}
题目内容:
下面程序的功能是从键盘任意输入n个数,然后找出其中的最大数与最小数,并将其位置对换。目前程序中存在错误,请修改正确。并按照给出的程序运行结果示例检查修改后的程序。
程序运行结果示例1:
Input n(n<=10):
5↙
Input 5 Numbers:
12 4 6 7 0↙
After MaxMinExchange:
0 4 6 7 12
程序运行结果示例2:
Input n(n<=10):
6↙
Input 6 Numbers:
7 -3 2 0 56 18↙
After MaxMinExchange:
7 56 2 0 -3 18
#include
#define ARR_SIZE 10
int main()
{
int a[ARR_SIZE], i, n;
printf("Input n(n<=10):\n");
scanf("%d", &n);
printf("Input %d Numbers:\n", n);
for (i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
MaxMinExchang(a, n);
printf("After MaxMinExchange:\n");
for (i=0; i<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
void MaxMinExchang(int *a, int n)
{
int maxValue = a[0], minValue = a[0], maxPos, minPos;
int i, temp;
for (i=0; i<n; i++)
{
if (a[i] > maxValue)
{
maxValue = a[i];
maxPos = i;
}
if (a[i] < minValue)
{
minValue = a[i];
minPos = i;
}
}
temp = a[maxPos];
a[maxPos] = a[minPos];
a[minPos] = temp;
修改后:
#include
#define N 10
void MaxMinExchang(int *a, int n);
int main()
{
int a[N], i, n;
printf("Input n(n<=10):\n");
scanf("%d", &n);
printf("Input %d Numbers:\n", n);
for (i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
MaxMinExchang(a, n);
printf("After MaxMinExchange:\n");
for (i=0; i<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
void MaxMinExchang(int *a, int n)
{
int maxValue = a[0], minValue = a[0], maxPos=0, minPos=0;
int i, temp;
for (i=0; i<n; i++)
{
if (a[i] > maxValue)
{
maxValue = a[i];
maxPos = i;
}
if (a[i] < minValue)
{
minValue = a[i];
minPos = i;
}
}
temp = a[maxPos];
a[maxPos] = a[minPos];
a[minPos] = temp;
}
题目内容:
从键盘任意输入一个自然数n(n表示矩阵的大小,假设不超过100),请编程输出一个n*n的蛇形矩阵。如果输入的n不是自然数或者输入了不合法的数字,则输出"Input error!"。
函数原型: void ZigzagMatrix(int a[][N], int n);
函数功能:计算n*n的蛇形矩阵
提示:用两个双重循环分别计算n*n矩阵的左上三角和右下三角,设置一个计数器从1开始记录当前要写入矩阵的元素值,每次写完一个计数器加1,在计算左上角和右下角矩阵元素时,分奇数和偶数两种情况考虑待写入的元素在矩阵中的行列下标位置。
程序运行结果示例1:
Input n:
5↙
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
程序运行结果示例2:
Input n:
4↙
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
程序运行结果示例3:
Input n:
-5↙
Input error!
程序运行结果示例4:
Input n:
105↙
Input error!
程序运行结果示例5:
Input n:
w↙
Input error!
#include
#define N 100
void ZigzagMatrix(int a[][N], int n);
int main()
{
int n, a[N][N], i, j;
printf("Input n:\n");
if(scanf( "%d", &n)!=1||n<=0||n>100)
printf("Input error!\n");
else
{
ZigzagMatrix(a, n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
}
return 0;
}
void ZigzagMatrix(int a[][N], int n)
{
int num, i, j, k;//k=1 is rightwards, k=2 is downwards; k=3 is from upper right corner to lower left; k=4 is from
//lower left to upper right
num=1;
a[0][0]=num;
i=0;
j=0;
k=1;
while(num<n*(n-1)/2+n)//左上三角
{
if(k==1)
{
a[i][++j]=++num;
k=3;
}
else if(k==2)
{
a[++i][j]=++num;
k=4;
}
else if(k==3)
{
a[++i][--j]=++num;
if(j==0)
{
k=2;
}
else
k=3;
}
else if(k==4)
{
a[--i][++j]=++num;
if(i==0)
k=1;
else
k=4;
}
}
if(n%2==0)
k=1; //n为偶数时,左上三角最后一个数在左下角
else
k=2; //if n is odd, last num of left triangle is at upper right corner
while(num<n*n)
{
if(k==1)
{
a[i][++j]=++num;
k=4;
}
if(k==2)
{
a[++i][j]=++num;
k=3;
}
if(k==3)
{
a[++i][--j]=++num;
if(i==n-1)
{
k=1;
}
else
k=3;
}
if(k==4)
{
a[--i][++j]=++num;
if(j==n-1)
k=2;
else
k=4;
}
}
}
题目内容:
2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系:
220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
284的真因数之和为:1+2+4+71+142=220
毕达哥拉斯把这样的数对称为相亲数。相亲数,也称为亲密数,如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。
从键盘任意输入两个整数m和n,编程判断m和n是否是亲密数。若是亲密数,则输出“Yes!”,否则输出“No!”
程序运行示例1
Input m, n:
220,284↙
Yes!
程序运行示例2
Input m, n:
224,280↙
No!
#include
#include
int SumDivisor(int x);
int main()
{
int m, n;
printf("Input m, n:\n");
scanf("%d,%d", &m, &n);
if(SumDivisor(m)==n&&SumDivisor(n)==m)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
int SumDivisor(int x)
{
int sum=0, i;
for(i=1;i<x;i++)
{
if(x%i==0)
sum+=i;
}
return sum;
}
题目内容:
2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系:
220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
284的真因数之和为:1+2+4+71+142=220
毕达哥拉斯把这样的数对称为相亲数。相亲数,也称为亲密数,如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。
从键盘任意输入一个整数n,编程计算并输出n以内的全部亲密数。
程序运行示例1
Input n:
3000↙
(220,284)
(1184,1210)
(2620,2924)
程序运行示例2
Input n:
1000↙
(220,284)
#include
#include
int SumDivisor(int x);
int main()
{
int m, x, n;
printf("Input n:\n");
scanf("%d", &x);
for(m=1;m<=x;m++)
{
n=SumDivisor(m);
if(n>m)
{
if(SumDivisor(n)==m)
printf( "(%d,%d)\n", m, n);
}
}
return 0;
}
int SumDivisor(int x)
{
int sum=0, i;
for(i=1;i<x;i++)
{
if(x%i==0)
sum+=i;
}
return sum;
}
题目内容:
完全数(Perfect Number),又称完美数或完数,它是指这样的一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身,即m的所有小于m的不同因子(包括1)加起来恰好等于m本身。注意:1没有真因子,所以1不是完全数。计算机已经证实在10300以下,没有奇数的完全数。例如,因为6 = 1 + 2 + 3,所以6是一个完全数。
从键盘任意输入一个整数m,编程判断m是否是完全数。若m是完全数,则输出“Yes!”,并同时打印出每一个完美数的全部因子,以验证这个数确实是一个完美数。若m不是完全数,则输出“No!”
程序运行示例1
Input m:
28↙
Yes!
1,2,4,7,14
程序运行示例2
Input m:
6↙
Yes!
1,2,3
程序运行示例3
Input m:
1↙
No!
#include
#include
#define N 100
int PerfectNum(int x, int a[]);
int main()
{
int a[N]={0}, m, i;
printf("Input m:\n");
scanf("%d", &m);
if(PerfectNum(m, a)==1)
{
printf("Yes!\n");
printf("%d", a[0]);
i=1;
while(a[i]!=0)
{
printf(",%d", a[i]);
i++;
}
}
else
printf( "No!\n");
return 0;
}
int PerfectNum(int x, int a[])
{
int sum=0, i, j=0;
for(i=1;i<x;i++)
{
if(x%i==0)
{
a[j]=i;
j++;
sum+=i;
}
}
if(sum==x)
return 1;
return 0;
}
题目内容:
所谓回文素数是指对一个素数n,从左到右和从右到左读是相同的,这样的数就称为回文素数,例如11,101,313等。编程计算并输出不超过n(100<=n<1000)的回文素数,并统计这些回文素数的个数,其中n的值从键盘输入。
程序运行示例1
Input n:
100↙
11
count=1
程序运行示例2
Input n:
1000↙
11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
count=16
#include
#include
int PrimeNum(int n);
int main()
{
int n, i, count=0;
printf("Input n:\n");
scanf("%d", &n);
for(i=10;i<=n;i++)
{
if(PrimeNum(i)==1)
{
printf("%4d", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
int PrimeNum(int n)
{
int i;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return 0;
}
if(n<100)
{
if(n/10!=n%10)
return 0;
}
else
{
if(n/100!=n%10)
return 0;
}
return 1;
}
题目内容:
形如2i-1的素数,称为梅森尼数。编程计算并输出指数i在[2,n]中的所有梅森尼数,并统计这些梅森尼数的个数,其中n的值由键盘输入,并且n的值不能大于50。其中,2i表示2的i次方,请不要使用pow(2,i)编程计算,应采用循环累乘求积的方式计算2^i。
提示:当i 超过30以后,2^i-1的值会很大,不能用long型变量来存储,必须使用double类型来存储。对于double类型变量x(不是整型)不能执行求余运算,即不能用 x % i == 0来判断x是否能被i整除,可以使用 x / i == (int)(x/i)来判断x是否能被i整除。
程序运行示例:
Input n:
50↙
2^2-1=3
2^3-1=7
2^5-1=31
2^7-1=127
2^13-1=8191
2^17-1=131071
2^19-1=524287
2^31-1=2147483647
2^49-1=562949953421311
count=9
#include
#include
int PrimeNum(double n);
int main()
{
int n, i, count=0;
double x;
printf("Input n:\n");
scanf("%d", &n);
x=1;
for(i=2;i<=n;i++)
{
x=(x+1)*2-1;
if(PrimeNum(x)==1)
{
printf("2^%d-1=%.0lf\n", i, x);
count++;
}
}
printf("count=%d\n", count);
return 0;
}
int PrimeNum(double n)
{
int i;
for(i=2;i<=sqrt(n);i++)
{
if(n/i==(int)(n/i))
{
return 0;
}
}
return 1;
}
题目内容:某公司有职员(最多50人),试编写程序打印最高工资、最低工资和平均工资。公司人数在主函数给出,职工工资输入请调用Input函数,计算最高工资、最低工资和平均工资调用Compute函数,打印最高工资、最低工资和平均工资在主函数。请在给定的框架下写出完整程序。
#include
void Input(float wage[], int n);
float Compute(float wage[], int n, float *pmaxwage, float *pminwage);
int main()
{
float wage[50],maxwage,minwage,avewage;
int n;
printf("Please input n:\n");
scanf("%d",&n);
Input( ... );
avewage=Compute( ... );
printf("maxwage=%.2f, minwage=%.2f, avewage=%.2f\n",maxwage,minwage,avewage);
return 0;
}
void Input(float wage[], int n)
{
...
}
float Compute(float wage[], int n, float *pmaxwage, float *pminwage)
{
...
}
#include
void Input(float wage[], int n);
float Compute(float wage[], int n, float *pmaxwage, float *pminwage);
int main()
{
float wage[50],maxwage,minwage,avewage;
int n;
printf("Please input n:\n");
scanf("%d",&n);
Input(wage, n);
avewage=Compute(wage, n, &maxwage, &minwage);
printf("maxwage=%.2f, minwage=%.2f, avewage=%.2f\n",maxwage,minwage,avewage);
return 0;
}
void Input(float wage[], int n)
{
int i;
for(i=0;i<n;i++)
{
scanf("%f", &wage[i]);
}
}
float Compute(float wage[], int n, float *pmaxwage, float *pminwage)
{
float sum=0;
int i;
*pmaxwage=wage[0];
*pminwage=wage[0];
for(i=0;i<n;i++)
{
if(wage[i]>*pmaxwage)
*pmaxwage=wage[i];
if(wage[i]<*pminwage)
*pminwage=wage[i];
sum=sum+wage[i];
}
return sum/n;
}
题目内容:
从键盘输入一个数,检查这个数中是否有重复出现的数字。如果这个数中有重复出现的数字,则显示“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!
#include
int CountRepeatNum(int count[], int n);
int main()
{
int n;
int count[10]={0};
printf("Input n:\n");
scanf("%d", &n);
if(CountRepeatNum(count, n)==-1)
printf("No repeated digit!\n");
else
printf("Repeated digit!\n");
return 0;
}
int CountRepeatNum(int count[], int n)
{
int x;
do{
x=n%10;
switch(x)
{
case 1: count[1]++;
if(count[1]==2) return 1;
break;
case 2: count[2]++;
if(count[2]==2) return 2;
break;
case 3: count[3]++;
if(count[3]==2) return 3;
break;
case 4: count[4]++;
if(count[4]==2) return 4;
break;
case 5: count[5]++;
if(count[5]==2) return 5;
break;
case 6: count[6]++;
if(count[6]==2) return 6;
break;
case 7: count[7]++;
if(count[7]==2) return 7;
break;
case 8: count[8]++;
if(count[8]==2) return 8;
break;
case 9: count[9]++;
if(count[9]==2) return 9;
break;
case 0: count[0]++;
if(count[0]==2) return 10;
break;
}
n/=10;
}while(n!=0);
return -1;
}
题目内容:
教授正在为一个有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
#include
#define N 1000
int IsCancel(int a[], int n, int k);
int main()
{
int n, k, i, student[N];
printf("Input n,k:\n");
scanf("%d,%d", &n, &k);
for(i=0;i<n;i++)
{
scanf("%d", &student[i]);
}
if(IsCancel(student, n, k)==0)
printf("NO");
else
printf("YES");
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!
#include
#define N 10
void FindSaddlePoint(int a[][N], int m, int n);
int main()
{
int a[N][N], m, n, i, j;
printf("Input m,n:\n");
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]);
}
FindSaddlePoint(a, m, n);
return 0;
}
void FindSaddlePoint(int a[][N], int m, int n)
{
int i, j, maxRow, maxj, flag, x;
for(i=0;i<m;i++)
{
maxRow=a[i][0];
maxj=0;
for(j=1;j<n;j++)
{
if(maxRow<a[i][j])
{
maxRow=a[i][j];
maxj=j;
}
}
flag=0;
for(x=0;x<m;x++)
{
if(maxRow>a[x][maxj])
flag=1;
}
if(flag==0)
{
printf("a[%d][%d] is %d\n", i, maxj, maxRow);
exit(0);
}
}
printf("No saddle point!\n");
}
题目内容:
试求出所有三位阶乘和数:m=a!+b!+c!(其中a为百位数字,b为十位数字,c为个位数字。约定0!=1,并输出所有的m)
#include
#define N 10
int Factorial(int x);
int main()
{
long i, a, b, c;
for(i=100;i<1000;i++)
{
a=i/100;
b=i/10%10;
c=i%10;
if(i==Factorial(a)+Factorial(b)+Factorial(c))
printf("%ld\n", i);
}
return 0;
}
int Factorial(int x)
{
if(x==0)
return 1;
if(x==1)
return 1;
else
return x*Factorial(x-1);
}