一、回文数
问题:“地满红花红满地,天连碧水碧连天”是一副回文联,用回文形式写成的对联,既可以顺读,也可以倒读,意思不变。在数学中也存在这样特征的一类数,称为回文数。设n是一任意自然数,将n各个数位上的数字反向排列所得自然数m,若m等于n,则n为回文数。例如,1234321是回文数,1234567不是回文数。
试编一程序,判断一个自然数是不是回文数。
如何将自然数n各个数位上的数字反向排列,组成新的自然数m?如输入的数n为123时,可先将m的初值设为0。第1次,先运用整除求余运算将n个位上的数字分离出来,即123%10得到3,再用m*10+3组成的新数赋值给m,然后将n的值缩小10倍;第2次,重复上面的步骤后,m为32,n为1;第3次,重复上面的步骤后,m为321,n为0。由于此时n的值为0,新数m构造完成,如图所示。
因为输入的自然数其位数是不确定的,因此每次分离数位时,循环次数也是不确定的。for语句使用很灵活,不仅可以用于循环次数已经确定的情况,而且也可以用于循环次数不确定而循环结束条件确定的情况。
流程图:
#include <iostream>
using namespace std;
int main()
{int num,n,m;cin>>num;m=0;n=num;for(;n>0;){m=m*10+n%10;n=n/10;}if(m==num) cout<<"是回文数"<<endl;else cout<<"不是回文数"<<endl;return 0;
}
可以把for语句在形式上稍作修改,程序如下:
for(n=num; n>0; n=n/10)m=m*10+n%10;
练习:
(1)下列文件扩展名为声音文件格式的是( )。
A.doc B.wav C.exe D.txt
(2)阅读程序写结果
#include <iostream>
using namespace std;
int main()
{int i,bai,ge, ans=0;for(i=100;i<=130;i++){bai=i/100;ge=i%10;if(bai==ge)ans++;}cout << ans << endl;return 0;
}
i,bai,ge,ans的输出:________________
(3)完善程序。
输入一个数,判断是不是完全数。完全数是指此数所有的真因子(即除了自身以外的约数)之和等于自己。如6=1+2+3,就是完全数。
#include <iostream>
using namespace std;
int main()
{int n, i, sum=0;cout<<"n=";cin>>n;for(i=1;i<n;i++)if(n%i==0) ______________;if(_______)cout<"是完全数";elsccout<"不是完全数";return 0;
}
二、斐波那契数列及长整型 long
斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,··,这个数列从第3个数开始,每个数都等于前面两个数的和。这个数列与大自然中植物的关系极为密切,几乎所有花朵的花瓣数都来自这个数列中的一项数字,同时在植物的叶、枝、茎等排列中也存在斐波那契数列。
试编一程序,输出斐波那契数列中的前10项。
斐波那契数列的前两项为1,从第3项开始,每一项的值是前面两项的和。可以先把第1项al和第2项a2赋值为1;求第3项a3时,只要把al+a2的和赋值给a3并输出即可,再把a2赋值给al,a3赋值给a2,为求下一项做准备;然后依次重复执行求第3项的步骤,求出前10项。流程图如:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{long i,a1,a2,a3;a2=a1=1;cout<<setw(5)<<a1;cout<<setw(5)<<a2; for(i=3;i<=10;i++){a3=a1+a2;cout<<setw(5)<<a3;a1=a2;a2=a3;} return 0;
}
注:
在Dev-C+、Visual C++中,长整型 long的取值范围和整型int的取值范围是一样的,即-2147483648~2147483647,不要把长整型long当成超长整型long long的缩写。其实,C+并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,由各种C++编译系统根据自己的情况做出安排。C++只是规定int型数据所占的字节数不大于long型,long型数据所占的字节数不大于long long 型。
练习:
(1)如果开始时计算机处于小写输入状态,现在尼克反复CapsLock、字母键A、字母键S的顺序按键,在屏幕上输出的第符是字母()。
A.A B.S C.a D.s
(2)阅读程序写结果。
#include<iostream>
using namespace std;
int main()
{int a, b, i;cin>>a;b=l;for(i=l;i<a;i++){b*=i;if(b%3==0)b/=3;if(b%5==0)b/=5;}cout <<b<<endl;return 0;}
输入:8
a,b,i的输出:____________________
(3)完善程序。
一个有规律的数列,其前6项分别是1,3,7,15,31,63。规律如图37.2所示,编程输出这个数列的前30项。
#include<iostream>
using namespace std;
int main()
{long long a, n;n=2;a=l;for(int i=l; i<=30;i++){cout<<a<<endl;_____________;—————————————;}return 0;
}
三、逻辑判断与推理
问题:A、B、C、D四人中有一个人是小偷,已知四个人中有一个人说了假话,请根据四个人的供词来判断谁是小偷。
A:我不是小偷。
B:C是小偷。
C:D是小偷。
D:我不是小偷。
假设你是警察,请编个程序来判断一下,谁是小偷。
可以用1、2、3、4这四个数字分别作为A、B、C、D这四个人的编号。用变量i代表小偷,则四人所说的话可以分别用以下的逻辑式来表示:
A:我不是小偷,即i!=1。
B:C是小偷,即i==3。
C:D是小偷,即i==4。
D:我不是小偷,即i!=4。
如果说了真话,它的逻辑值就是“真”(true,值为1),说了假话它的逻辑值就是为“假”(false,值为0)。其中有一人说了假话,就是三个人说了真话,所以应该是:
(i!=1)+(i==3)+(i==4)+(i!=4)==3
i值由1到4枚举就可以得到结果。流程图如图:
#include <iostream>
using namespace std;
int main()
{ int i;char xiaotou;for(i=1;i<=4;i++)if((i!=1)+(i==3)+(i==4)+(i!=4)==3){xiaotou=64+i;cout<<"小偷是:"<<xiaotou;break;}return 0;
}
运行结果:
小偷是:c
可以应用枚举和逻辑表达式解决一些逻辑判断和逻辑推理问题,实现初级的人工智能。让计算机像人一样学习、思考,让计算机听懂人的语言,让计算机自动进行程序设计等都是人工智能研究的内容。人工智能、基因工程和纳米技术被称为21世纪三大尖端技术。
练习:
(1)计算机如果缺少( ),将无法正常启动。
A.内存 B.鼠标 C.U盘 D.摄像头
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{int i,n;char ans;cin>>n;ans='0';for(i=l; i<n; i++)if((1%3=0)+(1%5=0)+(%2=0)==2)ans++;cout << ans << endl;return 0:
}
输入:15
i,n,ans的输出:______________
(3)完善程序。
一天,校长到机器人教室检查,看见一只仿生机器人——猴子,做得十分可爱,便问是谁做的,狐狸老师等人想和校长开个玩笑,于是狐狸老师说:“是尼克做的。”尼克说:“不是我做的。”格莱尔说:“不是我做的。”如果他们中有两个人说了假话,一人说了真话,请你判断是谁做的。
#include <iostream>
using namespace std;
int main()
{______________;for(i=1;i<=3;i++)if((i==2)+(i!=2)+(____)==1)break;switch(i){case l: cout <"狐狸老师做的 "<endl; break;case 2: cout <<"尼克做的 "<<endl; break;case 3: cout <<"格莱尔做的 "<<endl; break;}return 0;
}
四、for语句的应用
可以使用rand()%(9-1+1)+1随机产生一个一位数。我们设定0为加法,1为减法,使用rand()%2随机产生加减运算符。当是减法运算且x小于y时,可以交换x和y的值,也可以用y-x,以确保被减数大于减数。
试编一个“口算大师”程序,随机出10道一位数加减法的算术题,每完成一题后判断对错,每题10分,满分100分,全部完成后输出成绩。
流程图如:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{ srand(time(0));int x,y,symbol,ans;int n,temp,sum=0; for(int i=0; i<10; i++) { x=rand()%9+1; y=rand()%9+1; symbol=rand()%2; if(x<y&&symbol==1) { temp=x; x=y; y=temp; } switch(symbol) { case 0: ans=x+y; cout<<x<<'+'<<y<<'='; break; case 1: ans=x-y; cout<<x<< '-'<<y<<'='; break; } cin>>n; if(n==ans) {sum+=10; cout<<" 对! "<<endl; }else cout<<" 错! "<<endl; } cout<<"得分:"<<sum<<endl; return 0;
}
练习:
(1)目前个人计算机的( )市场占有率最靠前的厂商包括Intel、AMD等公司。
A.显示器 B.CPU C.内存 D.鼠标
2.阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{int i, x, y, n, ans=0;for(i=50;i<=60;i++){x=i%10;y=i/10;n=x*l0+y;if(i+n<100)ans++;}cout <<ans <<endl;return 0;
}
(3)完善程序
利用随机函数,编一个与计算机玩剪刀、石头、布游戏的程序,同时统计出计算机赢的局数和你赢的局数。
#include <iostream>
#include<ctime>
#include <cstdlib>
using namespace std;
int main()
{const int MAX=10;srand(time(0));int m, n, countm, countn;countm=countn=0;for(int i=0; i<MAX; i++){______________;cout<<"请你出招"<<endl;cout<"1.剪刀2.石头3.布"<<endl;cin>>n;if(n<llln>3)cout<<"请输入1~3,此局无效!"<endl;else{switch(m-n){case-2:case 1: cout <"计算机赢 !"<<endl; countm++; break;case_____:cout <"平局!"<endl; break;default: cout <"你赢!"<endl; countn++; break;}}cout<<"计算机赢:"<<__________<<endl;cout<<"你赢: "<< countn <endl;return 0;
}