目录
- 题目
- 1.1 求1~n的连续整数和。
- 1.2 对于1到n的每个整数n,输出log2n,根号n,n ,nlog2n ,n^2 ,n^3 ,2^n ,n!的值。
- 1.3 求1~n的素数的个数,并且计算出时间
- 1.4 求1~n的连续整数阶乘的和。
题目
1.1 求1~n的连续整数和。
#include<stdio.h>
#include<math.h>
#include<time.h>
//--------------------方法一--------------
int sum1(long n)
{return((n*(n+1))/2);
}
void AddTime1(long n)
{clock_t t;long sum;t = clock();sum = sum1(n); t = clock() - t;printf("方法一:%d\n",sum);printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
}
//--------------------方法二------------------
int sum2(long n)
{ long i, sum = 0;for (i = 0; i <= n; i++)sum = i + sum;return(sum);
}
void AddTime2(long n)
{clock_t t;long sum;t = clock();sum = sum1(n); t = clock() - t;printf("方法二:%d\n",sum);printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
}
int main()
{AddTime1(10000000);AddTime2(9999999999);return 0;
}
运行结果:
运行结果的时间为什么会是0?我试了很多情况都是这个结果,我猜测应该是这个时间太快了,运算不出来。
1.2 对于1到n的每个整数n,输出log2n,根号n,n ,nlog2n ,n^2 ,n^3 ,2^n ,n!的值。
#include <stdio.h>
#include <stdlib.h>
#include<math.h> double log(double n);
double sqrt(double n);
int main()
{int i,n,t,r,p=1,q=1,m;printf("请输入n的值:");scanf("%d",&n);
//--------------log------------------------- for(i=1;i<=n;i++){int v;m=log(i)/log(2);v=i*(log(i)/log(2));printf("%d的Log: %d.\n",i,m);printf("%d倍的Log: %d.\n",i,v);}printf("\n");
//--------------------开根函数------------------- for(i=1;i<=n;i++){int k;k=sqrt(i);printf("根号%d: %d.\n",i,k); }printf("\n");
//---------------输入n------------------------------- for(i=1;i<=n;i++) {int o;o=i;printf("n: %d.\n",o);}printf("\n");
//------------------n^2与n^3----------------------for(i=1;i<=n;i++) {t=i*i;r=i*i*i;printf("%d的平方: %d, %d的立方: %d.\n",i,t,i,r);}printf("\n");
//-------------输出2的n次方------------------------for(i=1;i<=n;i++) {p=p*2;printf("2的%d次方: %d.\n",i,p);}printf("\n");
//-------------------输入n!--------------------------- for(i=1;i<=n;i++) {q=q*i;printf("%d! = %d.\n",i,q);}return 0;
}
运行结果:
1.3 求1~n的素数的个数,并且计算出时间
两个方法的结构相似,唯一不太一样的就是循环的次数不一样,前者是遍历到sqrt(n),后者是遍历到n/2。
#include<stdio.h>
#include<math.h>
#include<time.h>//-----------------方法一----------------
void countprime1()
{int n,f;printf("------------方法一 -----------------");printf("\n请输入n:");scanf("%d" ,&n);int count = 0;for (int i = 2; i <= n; i++){f=1;for(int j = 2; j <=sqrt(i); j++){if(i%j==0){f=0;break;}}if(f){count++;}}printf("1~%d的素数个数有%d个\n ",n,count);
}
//--------------------方法二-----------------------------
void countprime2()
{int n,f;printf("------------方法二 -----------------");printf("\n请输入n:");scanf("%d" ,&n);int count = 0;for (int i = 2; i <= n; i++){f=1;for(int j = 2; j <= i/2; j++){if(i%j==0){f=0;break;}}if(f){count++;}}printf("1~%d的素数个数有%d个\n ",n,count);
}
int main(){clock_t t;t = clock();countprime1();t = clock() - t;printf("用时:%f\n",((float)t)/CLOCKS_PER_SEC); printf("\n");t = clock();countprime2();t = clock() - t;printf("用时:%f\n",((float)t)/CLOCKS_PER_SEC); return 0;
}
运行结果:
1.4 求1~n的连续整数阶乘的和。
#include<stdio.h>//--------------求阶乘--------------------
int Fact(int i)
{if (i == 0)return 1;elsereturn i * Fact(i - 1);
}
int main()
{int i, j, n, sum = 0;printf("请输入n的值:");scanf("%d", &n);for (i = 1; i <= n; i++){j = Fact(i);sum = j + sum; //求和 }printf("1!+2!+....+%d! = %d ",n,sum);return 0;
}
运行结果: