实验题目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[10000];
int n,k,t,i=0;
for(n=0;n<1000000;n++)
{
int div = 1;
while(n/div >= 10)
div *= 10;
int k = n;
int flag = 1;
while(k > 0)
{
int left = k / div;
int right = k % 10;
if(left != right)
{
flag = 0;
break;
}
k = (k % div) / 10;
div /= 100;
}
if (flag == 1)
{
a[i] = n;
i++;
}
}
for(int j=0;j<i;j++){
printf("%d ",a[j]);
if((j+1)%10==0)
printf("\n");
}
return 0;
}