目录
1、习题5-3 使用函数计算两点间的距离 (10 分)
2、习题5-4 使用函数求素数和 (20 分)
3、习题5-5 使用函数统计指定数字的个数 (15 分)
4、习题5-6 使用函数输出水仙花数 (20 分)
5、习题5-7 使用函数求余弦函数的近似值 (15 分)
总结
1、习题5-3 使用函数计算两点间的距离 (10 分)
题目: 本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。
输入:在一行中给出 4个双精度浮点数 、、、,以空格间隔,为两点的坐标(,)、
()。
输出:在一行内输出两个点的距离。
优化目标:无。
算法思想:两点间距离公式 。
输入样例:
10 10 200 100
输出样例:
dist = 210.24
实现:
#include
#include
double dist( double x1, double y1, double x2, double y2 )
{
return pow( pow(x2-x1,2.0)+pow(y2-y1,2.0) , 0.5 );
}
int main()
{
double x1, y1, x2, y2;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
printf("dist = %.2f\n", dist(x1, y1, x2, y2));
return 0;
}
2、习题5-4 使用函数求素数和 (20 分)
题目: 本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。
输入:在一行中给出两个整型数m、n,题目保证用户传入的参数m
≤n
。
。
输出:在一行中输出所有在区间(m,n)内的素数以及这些素数的和。
优化目标:可能有更好的求素数的算法。
算法思想:使用试除法求素数。
因为因子是成对出现的,对自然数n,如果n有因子m,那么n/m也是n的因子,因此在成对出现的因子中必然有一个是小于等于,所以在求解时只用枚举到。
输入样例:
-1 10
输出样例:
Sum of ( 2 3 5 7 ) = 17
实现:
#include
#include
int prime( int p ){
if( p <= 1) return 0;
else{
for( int i = 2; i <= p/i; i++ ){
if( p%i == 0) return 0;
}
}// of if
return 1;
}
int PrimeSum( int m, int n )
{
int sum = 0;
for( int i = m; i <= n;i++ ){
if( prime(i) == 1) sum += i;
}//of for
return sum;
}//of PrimeSum
int main()
{
int m, n, p;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for( p = m; p <= n; p++ ) {
if( prime(p) != 0 )
printf("%d ", p);
}// of for
printf(") = %d\n", PrimeSum(m, n));
return 0;
}
3、习题5-5 使用函数统计指定数字的个数 (15 分)
题目: 本题要求实现一个统计整数中指定数字的个数的简单函数。
输入:在一行中分别给出两个整数,第一个是待统计的数,第二个是指定的数字
输出:在一行内按格式输出指定数字在待统计数字中出现的个数。
优化目标:无。
算法思想:无。
输入样例:
-21252 2
输出样例:
Number of digit 2 in -21252: 3
实现:
#include
int CountDigit( int number, int digit )
{
int cnt = 0,t = 0;
if( number < 0) number *= -1;
t = number;
while( t > 0){
if( t%10 == digit) cnt++;
t /= 10;
}
return cnt;
}
int main()
{
int number, digit;
scanf("%d %d", &number, &digit);
printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));
return 0;
}
4、习题5-6 使用函数输出水仙花数 (20 分)
题目: 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。
例如:153=++。
本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
输入:在一行中输入两个整数m,n。
输出:打印出给定区间(m,n)内所有的水仙花数,每个数占一行。
优化目标:可以用空间换取时间方法。
判断水仙花数与求数的位数的循环复用了,可以在再开一个数组存储每个位上的数字,并记录位数。
算法思想:两次循环,先求数的位数,然后再判断它的每个位上的数字的N次幂之和是否等于它本身。
输入样例:
153 400
输出样例:
153 is a narcissistic number
370
371
实现:
#include
#include
int narcissistic( int number )
{
int count = 0;
int tmpnum = number;
while(tmpnum > 0){//求位数
tmpnum /= 10;
count++;
}
int sum=0;
tmpnum = number;
while( tmpnum > 0 && count >= 3){//求各个位上的数字的幂次和
sum += pow(tmpnum % 10,count);
tmpnum /= 10;
}
if( sum == number) return 1;
else return 0;
}
void PrintN( int m, int n ){
for( int i = m+1; i < n ; i++){
if( narcissistic( i ) == 1) printf("%d\n",i);
}
return ;
}
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
5、习题5-7 使用函数求余弦函数的近似值 (15 分)
题目: 本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=/0!−/2!+/4!−/6!+⋯
输入:在一行中输入两个双精度浮点数分别为为误差上限e
和自变量x。
输出:在一行中输出满足误差要求的cos(x)的近似值。
优化目标:每次循环求最后项的分母和分子的过程可以是常数级。
算法思想:按公式进行简单的模拟,用递归函数求分母,分子每次乘。
输入样例:
0.01 -3.14
输出样例:
cos(-3.14) = -0.999899
实现:
#include
#include
int fact(int n){// n >= 0
if( n <= 1) return 1;
else{
return fact(n-1)*n;
}
}
double funcos( double e, double x )
{
if( x < 0 ) x *= -1;
int pos = 1,exp = 0,down = 0;
double last = 1.0,sum = 0;
sum +=last;
pos *= -1;
while( last >= e){
exp += 2;
down = fact( exp );
last = pow( x, exp)/ down;
sum += last*pos;
pos *= -1;
printf("%lf\n",sum);
}
return sum;
}
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
总结
今日复习了c的简单递归函数的应用(求阶乘)、math库函数、双精度浮点数以及试除法求素数,快要机试了,还得多练练。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)