PTA-练习8

目录

实验5-3 使用函数求Fibonacci数

实验5-4 输出每个月的天数

实验5-9 使用函数求余弦函数的近似值

实验5-11 空心的数字金字塔

实验6-6 使用函数验证哥德巴赫猜想

实验6-7 使用函数输出一个整数的逆序数

实验6-8 使用函数输出指定范围内的完数

实验8-1-7 数组循环右移

实验8-1-8 报数

实验8-2-4 使用函数实现字符串部分复制

实验8-2-9 长整数转化成16进制字符串


实验5-3 使用函数求Fibonacci数

/*int fib( int n ){
    if(n<3){
        return 1;
    }
    return fib(n-1)+fib(n-2);
}
*///这个个玩意会超时,
//使用数组试试看
#include <stdlib.h>
int fib( int n ){
    int *a=(int *)malloc(sizeof(int)*(n+1));
    a[1]=a[2]=1;
    for(int i=3;i<=n;i++){
        a[i]=a[i-1]+a[i-2];
    }
    return a[n];
}

实验5-4 输出每个月的天数

int MonthDays(int year, int month){
    switch(month){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        default:
            break;
    }
    if(month==2){
        if((year%4==0&&year%100!=0)||year%400==0){
            return 29;
        }
        return 28;
    
    }
}


实验5-9 使用函数求余弦函数的近似值


double funcos( double e, double x ){
    //pow(x,i)/jiecheng(i)//                                                                                                                                                ;
    double cosx=0;
    int i=0;
    double xiang=1;
    while(fabs(xiang)>=e){
        int jiecheng=1;
        i=i+2;
        for(int j=1;j<=i;j++){
            jiecheng=jiecheng*j;
        }
        cosx=xiang+cosx;
        xiang=pow(x,i)/jiecheng*pow(-1,i/2);
    }
    cosx=xiang+cosx;
    return cosx;
    
}

实验5-11 空心的数字金字塔

//n==1,   1
//n==2,   1
         //222
//n==3,
             /*

    1
   2 2
  33333
             */
//n==4
             /*
    1
   2 2
  3   3
 4444444
 */

//第一行是n-1个空格,+1
//第二行是,n-2空格,非最后一行就是中间2*n-3个空格

             
void hollowPyramid( int n ){

    for(int i=1;i<=n;i++){//每一行
        
        for(int j=1;j<=n-i;j++){
            printf(" ");
        }
        if(i==1){
            printf("%d",i);
        }else if(i>1&&i<n){
            printf("%d",i);
            for(int k=1;k<=2*i-3;k++){
                printf(" ");
            }
            printf("%d",i);
        }else if(i==n){
            for(int k=1;k<=2*i-1;k++){
                printf("%d",i);
            }
        }
        printf("\n");
    }
}


实验6-6 使用函数验证哥德巴赫猜想

//素数的判定,在2~~p/2之间如果有可以整除的数就不是
int prime( int p ){
    if(p==1){
        return 0;
    }
    for(int i=2;i<=p/2;i++){
        if(p%i==0){
            return 0;
        }
    }
    return 1;
}

void Goldbach( int n ){

    for(int i=2;i<=n/2;i++){
        if(prime(i)&&prime(n-i)){
            printf("%d=%d+%d",n,i,n-i);
            return ;
        }
    }
}


实验6-7 使用函数输出一个整数的逆序数

这题注意如何取数字,填数字,只需要每每得到一个数字,然后就把前面的数字*进制+这个数字。

即:在末尾填数字的方法:原数字*进制+这个数字

十进制:123的末尾加上4,得到1234,

                   只需要123*10+4=1234

二进制:101110在末尾加上1,得到1011101

int reverse( int number ){
	int sum=0;
	while(number){
		int d=number%10;
		sum=sum*10+d;
		number/=10;
	}
	return sum;
}
//因为负数对10取余余数还是负数,所以这里不用对负数进行特殊操作

实验6-8 使用函数输出指定范围内的完数

#include <stdio.h>

int factorsum( int number );
void PrintPN( int m, int n );
    
int main()
{
    int m, n;

    scanf("%d %d", &m, &n);
    if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);
    if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);
    PrintPN(m, n);

    return 0;
}

/* 你的代码将被嵌在这里 */

int factorsum( int number ){
    int sum=0;
    for(int i=1;i<number;i++){
        if(number%i==0){
            sum=sum+i;
        }
    }
    return sum;
}
void PrintPN( int m, int n ){
    int sum=0;
    for(int i=m;i<=n;i++){
        if(factorsum(i)==i){
            sum++;
            printf("%d = 1",i);
            for(int j=2;j<i;j++){
                if(i%j==0){
                    printf(" + %d",j);
                }
                if(j==i-1){
                    printf("\n");
                }
            }
        }//of if输出一个完数的和形式
    }
    if(sum==0){
        printf("No perfect number");
    }
}

实验6-9 使用函数输出指定范围内的Fibonacci数

int fib( int n ){
    if(n<3){
        return 1;
    }
    return fib(n-1)+fib(n-2);
}
void PrintFN( int m, int n ){//20 100
    int sum=0;
    for(int i=m;i<=n;i++){
        if(i==1&&n==1){
            sum++;
            printf("1 1");
            break;
        }
        if(i==1){
            sum++;
            printf("%d ",i);
        }

        int x=fib(1);
        int j=1;
        while(i>=x){//20>1
            if(i==x){
                sum++;
                if(fib(j+1)>n){
                    printf("%d",i);
                    break;
                }
                printf("%d ",i);
                break;
            }
            j++;
            x=fib(j);
            
        }//of while
    }
    if(sum==0){
        printf("No Fibonacci number");
    }
}

实验8-1-7 数组循环右移

//循环右移:构造一个数组b[m]用来存放最后的m个数,
//然后将0~~n-1-m个元素后移m个,然后把b[m]补全到前面

void ArrayShift( int a[], int n, int m ){
    
    m=m%n;
    
    int b[m+1];
    for(int i=n-m,j=0;i<=n-1;j++,i++){
        b[j]=a[i];
    }
    for(int i=n-1-m;i>=0;i--){
        a[i+m]=a[i];
    }
    for(int i=0;i<m;i++){
        a[i]=b[i];
    }
}
void ArrayShift(int a[], int n, int m) {
    // 避免 m 过大时重复移动,求模后只移动一次
    m %= n;
    int tmp[n];
    // a[i] 循环右移 m 个位置后下标由 i 变为 (n-m+i)%n,需推导求出
    for (int i = 0; i < n; i++) {
        tmp[i] = a[(n - m + i) % n];
    }
    // 重新赋值给 a[]
    for (int i = 0; i < n; i++) {
        a[i] = tmp[i];
    }
}

实验8-1-8 报数

这题我真的要无语了,这种找规律的题真的是一点都不想做。。。。。

//out[i]存放的是编号i+1推出的次序
void CountOff( int n, int m, int out[] ){
    out[n]=0;
    int x=1;//表示出去的次序
    int y=0;//表示现在的位置
    int sum=m;
    while(1){
        if(out[y]==0){
            sum--;
            y=(y+1)%n;
        }else{
            y=(y+1)%n;
        }
        if(sum==0){
            out[(y-1+n)%n]=x;
            sum=m;
            x++;
        }
        if(x==n+1){
            return;
        }
    }
}

 

实验8-2-4 使用函数实现字符串部分复制

空字符:'\0'

空字符串:""

#include <string.h>
void strmcpy( char *t, int m, char *s ){
    int n=strlen(t);
    
    if(m>n){
        strcpy(s,"");
        return;
    }
    int i,j;
    for(i=m-1,j=0;i<n;i++,j++){
        s[j]=t[i];
    }
    s[j]='\0';
    
}

实验8-2-9 长整数转化成16进制字符串

C语言学习--字符串和整型的转换-CSDN博客

//把长整型123456789变成16进制,
//10/2=5'''0
//5/2=2’‘’1
//2/2=1'''0
//1/2=0'''1
//所以十的二进制就是1010
//同理转换成16进制就是每次除以个16,取余数,放入字符串数组a
//然后知道商为零,然后把a逆序给p
//'0'=48,'A'=65,'a'=97

#include <stdlib.h>
#include <string.h>

void f( long int x, char *p ){
    /*
    int j=0;
    int flag=0;
    if(x<0){
        flag=1;
        x=-1*x;
    }
    if(x==0){
        strcpy(p,"0");
        return;
    }
    char a[10000]="";
    while(x!=0){
        int i=x%16;
        if(i<10){
            a[j]=i+'0';
            j++;
        }else if(i>=10){
            switch(i){
                case 10:
                    a[j]='A';
                    break;
                case 11:
                    a[j]='B';
                    break;
                case 12:
                    a[j]='C';
                    break;
                case 13:
                    a[j]='D';
                    break;
                case 14:
                    a[j]='E';
                    break;
                case 15:
                    a[j]='F';
                    break;
            }
            j++;
        }
        x=x/16;
    }
    int haha=0;
    if(flag==1){
        p[0]='-';
        haha++;
        for(int i=1;i<=j;i++){
            p[i]=a[j-i];
        }
    }else{
        for(int i=haha;i<j;i++){
        p[i]=a[j-i-1];
        }
    }
    */
    int flag=0;
    if(x<0){
        x=-1*x;
        flag=1;
    }
    sprintf(p,"%x",x);
    int n=strlen(p);
    if(flag){
        for(int i=n-1;i>=0;i--){
            p[i+1]=p[i];
        }
        p[0]='-';
    }
    
    for(int i=0;i<=n;i++){
        
        if(p[i]>='a'&&p[i]<='z'){
            p[i]=p[i]-32;
        }
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西柚小萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值