13C++循环结构-for循环(3)

一、回文数

问题:“地满红花红满地,天连碧水碧连天”是一副回文联,用回文形式写成的对联,既可以顺读,也可以倒读,意思不变。在数学中也存在这样特征的一类数,称为回文数。设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<"是完全数";
  elsc
    cout<"不是完全数";
  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;
}
posted @ 2024-12-27 20:24  gdyyx  阅读(154)  评论(0)    收藏  举报