《程序设计》函数题|011-020

习题5-8 空心的数字金字塔 – 浙大版《C语言程序设计(第4版)》题目集

// 输出:空心的数字金字塔
void hollowPyramid(int n){
    // 边界处理
    if(n==1){
        printf("1");
        return;
    }else if(n==2){
        printf(" 1\n");
        printf("222");
        return;
    }
    // 第1层
    for(int i=1;i<=n-1;++i){
        printf(" ");
    }
    printf("1\n");
    // 第2-(n-1)层
    for(int i=2;i<=n-1;++i){  // 第i层
        for(int j=1;j<=n-i;++j){
            printf(" ");
        }
        printf("%d",i);
        for(int j=1;j<=2*i-3;++j){
            printf(" ");
        }
        printf("%d\n",i);
    }
    // 第n层
    for(int i=1;i<=2*n-1;++i){
        printf("%d",n);
    }
    // 返回
}

习题6-1 分类统计字符个数 – 浙大版《C语言程序设计(第4版)》题目集

#include <string.h>

// 输出:分类统计字符个数
void StringCount(char s[]){
    int letter=0;
    int blank=0;
    int digit=0;
    int other=0;
    int sLen=strlen(s);
    for(int i=0;i<sLen;++i){
        if(s[i]>='a' && s[i]<='z'){
            ++letter;
        }else if(s[i]>='A' && s[i]<='Z'){
            ++letter;
        }else if(s[i]==' ' || s[i]=='\n'){
            ++blank;
        }else if(s[i]>='0' && s[i]<='9'){
            ++digit;
        }else{
            ++other;
        }
    }
    // 输出
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
    // 返回
    return;
}

习题6-2 使用函数求特殊a串数列和 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:n个a组成的数字
int fn(int a, int n){
    // 结果
    int result=0;
    // 计算n个a组成的数字
    for(int i=0;i<n;++i){
        result*=10;
        result+=a;
    }
    // 返回结果
    return result;
}

// 返回:要求的和
int SumA( int a, int n ){
    // 结果
    int result=0;
    // 计算特殊a串数列和
    for(int i=1;i<=n;++i){
        result+=fn(a,i);
    }
    // 返回结果
    return result;
}

习题6-3 使用函数输出指定范围内的完数 – 浙大版《C语言程序设计(第4版)》题目集

#include <stdbool.h>

// 返回:整数除自身外因子和
int factorsum(int number){
    // 结果
    int result=0;
    // 计算整数除自身外因子和
    int limit=number/2;
    for(int i=1;i<=limit;++i){
        if(number%i==0){
            result+=i;
        }
    }
    // 返回结果
    return result;
}
// 输出:指定范围内的完数的因子累加形式的分解式
void PrintPN(int m,int n){
    // 输出
    bool isFound=false;
    for(int i=m;i<=n;++i){
        if(factorsum(i)==i){
            isFound=true;
            printf("%d = 1",i);
            int limit=i/2;
            for(int j=2;j<=limit;++j){
                if(i%j==0){
                    printf(" + %d",j);
                }
            }
            printf("\n");
        }
    }
    if(!isFound){
        printf("No perfect number\n");
    }
    // 返回
    return;
}

习题6-4 使用函数输出指定范围内的Fibonacci数 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:第n项fib数
int fib(int n){
    // 边界处理
    if(n<=0){
        return 0;
    }else if(n==1 || n==2){
        return 1;
    }
    // 结果 nums[2]
    int nums[3]={0,1,1};
    // 滚动更新
    for(int i=2;i<n;++i){
        nums[0]=nums[1];
        nums[1]=nums[2];
        nums[2]=nums[0]+nums[1];
    }
    // 返回结果
    return nums[2];
}
// 输出:闭区间[m,n]内所有fib数
void PrintFN(int m, int n){
    // 输出
    int cnt=0;
    for(int i=0;fib(i)<=n;++i){
        int cur=fib(i);
        if(cur>=m){
            ++cnt;
            if(cnt>1){
                printf(" ");
            }
            printf("%d",cur);
        }
    }
    if(cnt==0){
        printf("No Fibonacci number");
    }
    // 返回
    return;
}

习题6-5 使用函数验证哥德巴赫猜想 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:素数->1 否则->0
int prime(int p){
    if(p<=1){
        return 0;
    }else if(p==2){
        return 1;
    }
    int result=1;
    int limit=(int)sqrt(p)+1;
    for(int i=2;i<=limit;++i){
        if(p%i==0){
            result=0;
            break;
        }
    }
    return result;
}

// 输出:n的素数分解n=p+q(要求p最小)
void Goldbach(int n){
    // 输出
    for(int i=3;i<=n/2;++i){
        if(prime(i)==1 && prime(n-i)==1){
            printf("%d=%d+%d",n,i,n-i);
            break;
        }
    }
    // 返回
    return;
}

习题6-6 使用函数输出一个整数的逆序数 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:整数的逆序数
int reverse(int number){
    // 边界处理
    if(number==0){
        return 0;
    }
    // 结果
    int result=0;
    // 求逆序数
    // 保存符号
    int sign=1;
    if(number<0){
        sign=-1;
        number*=-1;
    }
    int cur=0;
    while(number>0){
        result*=10;
        cur=number%10;
        number/=10;
        result+=cur;
    }
    result*=sign;
    // 返回结果
    return result;
}

练习8-2 计算两数的和与差 – 浙大版《C语言程序设计(第4版)》题目集

// 处理:计算两数的和与差
void sum_diff( float op1, float op2, float *psum, float *pdiff ){
    *psum=op1+op2;
    *pdiff=op1-op2;
    // 返回
    return;
}

练习8-8 移动字母 – 浙大版《C语言程序设计(第4版)》题目集

// 处理:移动字母
void Shift(char s[]){
    // 健壮性检查
    if(s==NULL){
        return;
    }
    // 移动字母
    char tmp[3];
    int sLen=strlen(s);
    for(int i=0;i<3;++i){
        tmp[i]=s[i];
    }
    for(int i=0;i<sLen-3;++i){
        s[i]=s[i+3];
    }
    for(int i=sLen-3;i<sLen;++i){
        s[i]=tmp[i+3-sLen];
    }
    // 返回
    return;
}

习题8-1 拆分实数的整数与小数部分 – 浙大版《C语言程序设计(第4版)》题目集

// 处理:拆分实数的整数和小数部分
void splitfloat(float x,int *intpart,float *fracpart){
    // 拆分
    *intpart=(int)x;
    *fracpart=x-*intpart;
    // 返回
    return;
}

《《程序设计》函数题|011-020》有1条评论

发表评论