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;
}

浙公网安备 33010602011771号