浙大版《C语言程序设计(第3版)》

浙大版《C语言程序设计(第3版)》,第1张

目录

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,题目保证用户传入的参数mn




输出:在一行中输出所有在区间(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库函数、双精度浮点数以及试除法求素数,快要机试了,还得多练练。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/562745.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-02
下一篇 2022-04-02

发表评论

登录后才能评论

评论列表(0条)

保存