目录
实验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,/*12 233333*/
//n==4/*12 23 34444444*///第一行是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 100int 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>1if(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;}}}