实验题目1:
写一个函数,求解以下数列前n项之和并输出,其中n应从键盘输入。
输入和输出样例如下:
样例一:
输入:Input n: 3
输出:sum = 5.166667
样例二:
输入:Input n: 20
输出:sum = 32.660259
分析:设第k项为a/b,则k+1项为(a+b)/a,所以可以利用递归的方法解决。
#include<stdio.h> int main(){ float sum(int n); int n; scanf("%d",&n); printf("s=%.6f\n",sum(n)); } float sum(int n){ int i; double a=2,b=1,sum=0,t; for(i=1;i<=n;i++) { sum=sum+a/b; t=a; a=a+b; b=t; } return sum; }实验题目2:
编程利用函数求从3~100之间的双质数(给定质数p和q,如果p = q + 2,则p和q为双质数)。
输入和输出要求:3和100应从键盘输入;每行仅输出一对双质数,分多行输出。
分析:设计两个for循环,首先循环找到3~100以内的质数,可以通过整除判别,循环起始为从2到sqrt(i)+1,(还有更棒的起始条件,读者可自行查阅),然后把找到的质数放到一个数组中,再利用第二次循环找到双质数(双质数必定相邻,这里不做解释)
#include<stdio.h> #include<math.h> int main(){ void fun(int m,int n); int m,n; scanf("%d,%d",&m,&n); fun(m,n); } void fun(int m,int n){ int a[50],k=0; for(int i=m;i<=n;i++){ int temp=0; for(int j=2;j<sqrt(i)+1;j++){ if(i%j==0){ temp=1; } } if(temp==0){ a[k]=i; k++; } } for(int i=0;i<k;i++){ if(a[i]==a[i+1]-2) printf("%d|%d\n",a[i],a[i+1]); } }实验题目3:
编写一个函数实现求10 000以内的回文数。所谓回文数就是将一个数从左向右读与从右向左读是一样的,例如,121和1331都是回文数。
输出要求:在函数中,将所有的回文数输出。在输出时,每输出10个回文数便换行输出。
分析:原理很简单,就是把每个整数的各位数拿出来,然后逆序组合,这里我根据位数大小讨论(实际上必然可以推导出一个适用于不同位数通用公式,以后有机会补上)
#include <stdio.h> #include <stdlib.h> int main() { int a[200]; int n,k,t,i=0; for(n=0;n<10000;n++) { t=n; if(t>=0&&t<=9) k=t; else if(t>=10&&t<100) k=t/10+(t)*10; else if(t>=100&&t<1000) k=n/100+(n/10)*10+(n)*100; else if(t>=1000&&t<10000) k=(n)*1000+((n/10))*100+(n/100)*10+(n/100)/10; if(k==n){ a[i]=k; i++; } } for(int j=0;j<i;j++){ printf("%d ",a[j]); if((j+1)==0) printf("\n"); } return 0; }