21Winter\ C语言\ 函数上机报告

C语言程序设计 第七章实验报告

expr1

已知求Sn的公式:

S n = ∑ i = 1 n i S_{n} = \sum _{i=1}^{n}i Sn=i=1ni
想要求出Sn从1到20的值

#include<stdio.h>
int psum(int n){
    int ans = 0;
    for(int i=0;i<=n;i++)
        ans+= i;
    return ans;
}
int main(){
    int m;
    scanf("%d",&m);
    for(int i=1;i<=20;i++){
    printf("%-5d",psum(i));
    if(!(i%4)) putchar('\n');
    }
    return 0;
}

expr2

使用基于指针进行双向地址传递的函数来同时返回一个数组之中的最大值和最小值

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void max_min(double *num, double *max, double *min){
    int n;
    for(n =1; n<10; n++){
        if(num[n]>*max)
            *max = num[n];
        if(num[n]<*min)
            *min = num[n];
    }
}
int main(){
    double *k = (double*)malloc(sizeof(double)*10);
    double max=0.00, min=0.00;
    srand((unsigned)time(NULL));
    for(int i=0;i<10;i++){
        k[i]= (rand()%1000)/77.0000;
        printf("%-8.3f",k[i]);
    }
    min = k[0]; 
    putchar('\n');
    max_min(k,&max,&min);
    printf("%f\t%f",max,min);
    return 0;
}

Line16 \ Line 18 使用当前的时间戳作为随机种子生成随机数。

(rand()%1000)/77.0000;

生成了伪随机的浮点数(因为rand生成的是随机整数)

需要注意的是,这个函数可以进行进一步的优化。在function之中就应该说明**min = k[0]; **而不是在main函数里面才说。

没有21行的话会导致输出min0.0000

考虑数据范围!!

expr3

判断一个数是不是“回归数”,即满足:
a n s = ∑ i = 0 n − 1 x i n a n s = ∑ j = 1 n − 1 1 0 j ∗ x j ans = \sum ^{n-1}_{i = 0} x_{i}^{n} \\ ans = \sum_{j = 1}^{n-1} 10^{j} * x_{j} ans=i=0n1xinans=j=1n110jxj

#include<stdio.h>
#include<math.h>
int regress(int m){
    int temp = m, ans = 1,sum=0;
    while(temp/=10) ans++;
    temp = m;
    for(;temp;temp/=10)
        sum+= pow(temp%10,ans);
    if(sum == m) return 1;
    else return 0;
    
}
int main(){
    for(int i=100;i<1000;i++){
        if(regress(i))printf("%-5d",i);
    }
    return 0;
}

regress先通过while循环来实现判断一个数字的长度,然后判断一个数是否为回归数。

expr4

使用递归来实现求组合数

#include<stdio.h>
int Combi(int n, int m){
    if(n>m/2) return Combi(m-n,m);
    else if(n == 1) return m;
    else if(n == 0) return 1;
    else
        return Combi(n,m-1)+ Combi(n-1,m-1);
}
int main(){
    int n,m;
    scanf("%d,%d",&n,&m);
    printf("%d",Combi(n,m));
    return 0;
}

C m n = { C m 0 = 1 , n = 0 ; C m 1 = m , n = 1 ; C m n = C m m − n , n > m 2 ; C m n = C m − 1 n + C m − 1 n − 1 ; C_{m}^{n}=\left\{ \begin{array}{rcl} C^{0}_{m} = 1, n=0;\\ C^{1}_{m} = m,n =1;\\ C^{n}_{m} = C^{m-n}_{m}, n>\frac{m}{2};\\ C^{n}_{m} = C^{n}_{m-1} + C^{n-1}_{m-1}; \end{array} \right. Cmn=Cm0=1,n=0;Cm1=m,n=1;Cmn=Cmmn,n>2m;Cmn=Cm1n+Cm1n1;

expr5

#include<stdio.h>
#define square(x) (x*x)
int main(){
    printf("%d",square(6)/square(3));
    return 0;
}

主函数: expr6.c

#include<stdio.h>
#include"myfun.c"
int main(){
    int m;
    scanf("%d",&m);
    fun(m);
    return 0;
}

分解质因数的函数: myfun.c

void fun(int m){
    int i = 2;
    printf("%d = 1",m);
    while(m>1){
        if(m%i==0){
            m/=i;
            printf("*%d",i);
        }
        else i++; 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值