24C++函数(2)——教学
一、函数应用之验证哥德巴赫猜想
(第74课 验证哥德巴赫猜想)
哥德巴赫猜想是近代三大数学难题之一,即任何一个大于2的偶数,都可表示成两个素数之和。如4=2+2,6=3+3,8=3+5,10=3+7。
定义一个判断素数的函数,利用它验证4~n之间的偶数都能够分解为两个素数之和,其中n≥4。
#include <iostream>
using namespace std;
int sushu(int x)
{
if( ) return 0;
if( ) return 1;
for(int i=2;i<=x-1;i++)
if( ) return 0;
return 1;
}
int main()
{
int i,j;
for(i=4;i<=10;i+=2)
{
for(j=2;j<i;j++)
if(sushu(j))
if(sushu(i-j))
{
cout<<i<<'='<<j<<'+'<<i-j<<endl;
break;
}
if(i==j) cout<<i<<"验证失败!"<<endl;
}
return 0;
}
二、数组名作为实参
(第75课 第n个大的数)
有10个互不相同的整数,不用排序,求出其中第n个大的数(1≤n≤10)。即有n-1个数比它大,其余的数都比它小。如数列99,200,95,87,98,-12,30,78,75,-25,输入2,表示输出第2个大的数,则为99。
定义一个找出数列中第n个大的数的函数,利用它输出第n个大的数。
用数组保存这10个数,求第n个大的数时,先从第一个数开始,将它与其余的数进行比较并记录比它大的数的个数(存于计数器num变量中)当num==n-1时,此数就是第n个大的数,否则对下一个数进行同样的处理。
#include <iostream>
using namespace std;
int maxn(int b[],int m)
{
bool p=true;
int x,num,i=0;
while(p)
{
x=b[i];
num=0;
for(int j=0;j<10;j++)
if( ) num++;
if(num==m-1)
p=false;
else
i++;
}
return x;
}
int main()
{
int n,a[10]={99,200,95,87,98,-12,30,87,75,-25};
do
{
cin>>n;
}while(n<1||n>10);
cout<<maxn( )<<endl; //数组名作为实参
return 0;
}
数组名代表数组首元素的地址。
用数组名作为实时,就是把数组首元素的地址传给形参,这样实参数组和形参数组就共占同一内存单元了。这时,若改变形参数组元素的值,将同时改变实参数组元素的值。而用变量作函数参数时,实参的值不会因形参值的改变而改变。
三、二分法查找
(第76课 猜猜乐)
格莱尔和尼克玩猜数游戏(1~100之间的整数)。格莱尔先选了一个数如56写在纸上,尼克用二分法去猜。
尼克第1次猜50,(1+100)÷2=50.5,取整数50,格莱尔说,小了。尼克第2次猜75,(51+100)÷2=75.5.取数75,格莱尔说,大了。尼克第3次猜62,(51+74)÷2=62.5,取整数62,格莱尔说,大了。第4次猜56,(51+61)÷2=56,格莱尔说,猜对了。
试编一程序,输入要猜的数,让计算机输出尼克使用二分法猜数的过程。
二分法猜数使用的是二分法查找(又称折半查找)算法。使用二分法查找时,被查找的数列必须是已排序的数列,如本例中1~100,由小到大升序排列。它的基本思路:假设被查找的数列是按升序排序的,对于给定值n,从数列的中间位置开始比较,如果当前位置值等于n,则查找成功;若n小于当前位置值,则在数列的前半段中查找;若n大于当前位置值则在数列的后半段中继续查找。如此反复,直到找到或找完整个数列为止。
#include <iostream>
using namespace std;
int search(int b[],int len,int key)
{
int high,low;
high=len-1;
low=0;
int mid=len/2;
while(high>=low)
{
mid= ;
cout<<b[mid]<<endl;
if(b[mid]==key)
return mid;
else if(b[mid]>key)
high= ;
else
low= ;
}
return 0;
}
main()
{
const int max=100;
int a[max],n;
for(int i=0;i<max;i++)
a[i]=i+1;
do
{
cin>>n;
}while(n<1||n>100);
if(search(a,max,n))
cout<<"成功!";
else
cout<<"失败!";
return 0;
}

浙公网安备 33010602011771号