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; 
}
posted @ 2025-06-04 21:29  gdyyx  阅读(63)  评论(0)    收藏  举报