第三次实验
实验1.
//利用局部static变量特性,计算阶乘 #include<stdio.h> long long fac(int n); int main() { int i,n; printf("Enter n: "); scanf("%d",&n); for(i=1;i<=n;i++) printf("%d!=%lld\n",i,fac(i)); return 0; } //函数定义 long long fac(int n) { static long long p=1; p=p*n; return p; }
//利用局部static变量特性,计算阶乘 #include<stdio.h> long long fac(int n); int main() { int i,n; printf("Enter n: "); scanf("%d",&n); for(i=1;i<=n;i++) printf("%d!=%lld\n",i,fac(i)); return 0; } //函数定义 long long fac(int n) { static long long p=1; printf("p=%lld\n",p); p=p*n; return p; }
猜测:8,16
#include<stdio.h> int func(int,int); int main() { int k=4,m=1,p1,p2; p1=func(k,m); p2=func(k,m); printf("%d,%d\n",p1,p2); return 0; } //函数定义 int func(int a,int b) { static int m=0,i=2; i+=m+1; m=i+a+b; return (m); }
错误原因:i也是静态变量,第二次为3。
局部static变量特性:保留每一次的运算结果,而不是重新赋值。
实验2.
迭代
#include<stdio.h> void printSymbol(int n,char symbol); int main() { int n; char symbol; while(scanf("%d %c",&n,&symbol)!=EOF) { printSymbol(n,symbol); printf("\n"); } return 0; } //函数定义 void printSymbol(int n,char symbol) { int i; for(i=0;i<n;i++) printf("%c",symbol); }
递归
#include<stdio.h> void printSymbol(int n,char symbol); int main() { int n; char symbol; while(scanf("%d %c",&n,&symbol)!=EOF) { printSymbol(n,symbol); printf("\n"); } return 0; } //函数定义 void printSymbol(int n,char symbol) { if(n==1) printf("%c",symbol); else { printSymbol(n-1,symbol); printf("%c",symbol); } }
递归更好,避免了引入新的变量,减少内存占用。
实验3.
#include<stdio.h> long long fun(int n); int main() { int n; long long f; while(scanf("%d",&n)!=EOF) { f=fun(n); printf("n=%d,f=%lld\n",n,f); } return 0; } //函数定义 long long fun(int n) { long long result; if(n==1) return 1; else { long long result=2*fun(n-1)+1; return result; } }
实验4.
#include<stdio.h> #include<math.h> int isPrime(int n) { int i; for(i=2;i<=sqrt(n);i++) { if(n%i==0) return 0; } return 1; } int main() { int n,j,count=0; for(n=101;n<=200;n++) { j=isPrime(n); if(j==0) { printf("%5d",n); count++; } } printf("\n101~200之间一共有%d个非素数",count); return 0; }
实验5.
#include<stdio.h> long fun(long s); int main() { long s,t; printf("Enter a number: "); while(scanf("%ld",&s)!=EOF) { t=fun(s); printf("new number is:%ld\n\n",t); printf("Enter a number: "); } return 0; } long fun(long s) { long sum1=0,sum=0,temp; for(temp=s;temp>0;temp/=10) { if(temp%2==1) sum1=sum1*10+temp%10; } while(sum1) { sum=sum*10+sum1%10; sum1/=10; } return sum; }
实验6.(注意小数运算至少要有一个小数)
#include<stdio.h> double fun(int n); int fac(int n); int main() { int n; double s; printf("Enter n(1~10): "); while(scanf("%d",&n)!=EOF) { s=fun(n); printf("n=%d,s=%f\n\n",n,s); printf("Enter n(1~10): "); } return 0; } double fun(int n) { double s; if(n==1) s=1; else s=fun(n-1)+1.0/fac(n); return s; } int fac(int n) { if(n==1) return 1; else { int s=(-1)*fac(n-1)*n; return s ; } }