目录
实验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;
}
}
}