24C++函数(2)

一、函数应用之验证哥德巴赫猜想

哥德巴赫猜想是近代三大数学难题之一,即任何一个大于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(x<1) return 0;
  if(x==2) return 1;
  for(int i=2;i<=x-1;i++)
    if(x%i==0) 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;
}

世界近代三大数学难题是费马猜想、四色猜想和哥德巴赫猜想。费马猜想、四色猜想已经被证明,只有哥德巴赫猜想尚未被完全证明。

练习

(1)网址www.jinhua.gov.cn中cn表示在()

    A.中国             B.法国            C.英国            D.美国

(2)阅读程序写结果。

#include <iostream>
using namespace std;
int fun(int n)
{
 int i, sum=0;
 for(i=l; i<=n;i++)
   sum+=i;
 return sum;
}
int main()
{
 int i, n, ans=0;
 cin>>n;
 for(i=1;i<n;i++)
  ans+=fun(i);
 cout<< ans <<endl;
 return 0;
}

输入:5
输出:__________
(3)完善程序。
一个n位超级素数是指一个n位正整数,它的前1位,前2位,......,前n位均为素数。例如:733是个3位超级素数,因为7,73,733均为素数。编一程序,输出全部的3位数超级素数。

#include <iostream>
using namespace std;
bool peime(int n)
{
 int i;
 if(n==1)return false;
 for(i=2;i<=n-1;i++)
 {
  if(n%i==0)
   return false;
  }
 return true;
}

bool superprime(int n)
{
 while(n>0)
 {
   if(____)
     n=n/10;
   else
    return false;
 }
 return true;
}

int main()
{
 int i;
 for(i=100;i<=999;i++)
 {
  if(_______)
    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(x<b[j]) 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(a,n)<<endl;  //数组名作为实参
  return 0;
}

数组名代表数组首元素的地址。

用数组名作为实时,就是把数组首元素的地址传给形参,这样实参数组和形参数组就共占同一内存单元了。这时,若改变形参数组元素的值,将同时改变实参数组元素的值。而用变量作函数参数时,实参的值不会因形参值的改变而改变。

练习

(1)以下列举的区特网各种功能中:错的是( )

    A.远程教育       B.穿越时空    C.购物         D.查询天气

2.阅读程序写结果。

#include <iostream>
using namespace std;
int fun(int b[])
{
 int max, sum;
 sum=max=b[0];
 for(int i=1; i<5; i++)
 {
  sum+=b[i];
  if(sum>max)max=sum;
 }
return max;
}
int main()
{
 int a[5], ans;
 for(int i=0; i<5; i++)
   cin>>a[i];
 ans=fun(a);
 cout << ans<< endl;
 return 0;
}

输入:1 2 3 -4 5
输出:
(3)完善程序。

#include <iostream>
using namespace std;
int maxn(int x,int a[])
{
 int num=1:
 for(int j=0: j<5;j++)
  if(_______)num++;
return num;
}
int main()
{
 int a[5], i;
 for(i=0;i<5;i++)
   cin>>a[i];
 for(i=0;i<5;i++)
  cout << a[i]<<"--"<<"__________"<<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=(high+low)/2;
    cout<<b[mid]<<endl;
    if(b[mid]==key)
      return mid;
    else if(b[mid]>key)
           high=mid-1;         
         else 
           low=mid+1;
  }
  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; 
}

练习

(1)已知一个顺序表由512个从小到大排列的整数组成,若依次采用顺序查找算法,最坏情况下的查找次数是( )。

     A.128       B.64       C.512         D.10

2.阅读程序写结果。

#include <iostream>
using namespace std;
int search(int b[], int n)
{
 int sum=0;
 for(int i=0; i<4;i++)
{
  if(b[i]<n) continue;
  if(b[i]==n) break;
  sum+=b[i];
  }
returm sum;
}
int main()
{
 int a1[4]={8,2,-3,-4};
 int a2[4]={90, -1, 10,100};
 int ans=0;
 ans+=scarch(a1,0);
 ans+=search(a2, 10);
 cout<< ans<< endl;
 return 0;
}


输出:
(3)完善程序。
风之巅小学的红领巾电视台有若干名小播音员,编写一个简易的姓名查询程序,输入学生姓名,若是在名单中找到,则输出“是小播音员”,否则输出“不是小播音员”。

#include <iostream>
#include <string>
#define MAX 5        //用define定义符号常量(用一个标识符来替代常量,MAX替代5)
using namespace std;
bool search(string bl]. string key)
{
 int i;
 bool f=false;
 for(i=0;i<MAX;i++)
  if(keys =b[i])
   {
    f=true;
    break;
   }
 return _______;
}
int main()
{
 string name,a[MAX]={"nike", "make", "mani", "boli", "glair"};
 cin>>name;
if(__________)
  cout<<"是小播音员"<<endl;
else
  cout<"不是小播音员"<<endl;
return 0;
}
posted @ 2025-06-10 21:01  gdyyx  阅读(26)  评论(0)    收藏  举报