信息学奥赛之c++算法(三)水仙花数、回文数

网友投稿 2018-11-19 11:12

水仙花数:指一个三位数,数字本身等于各个位数上的立方之和。如153=

13+53+33,要求水仙花数,首先要学会分离百位、十位、个位上的数。用153/100可以得到百位上的数,(153/10)%10或(153%100)/10可得到十位上的数字,153%10可以得到个位上的数字。之后通过遍历100--999之间所有的数,对每一个数进行计算和判断,程序的流程图如下:

https://cdn.china-scratch.com/timg/181121/1112555L7-0.jpg

如果要计算水仙花数的个数,可以加一个统计变量,程序代码如下 :

#include

using namespace std;

int main(){

int ge,shi,bai,count=0; 

for(int i=100;i<1000;i++){

bai = i/100;

shi = (i/10)%10;

ge = i%10;

if(bai*bai*bai+shi*shi*shi+ge*ge*ge==i){

cout<<i<<endl;< p="">

count++; 

}

}

cout <<"水仙花数共有 "<<count<<" 个。";<="" p="">

return 0;

程序运行结果:

https://cdn.china-scratch.com/timg/181121/11125530V-1.jpg

再来看回文数:任意一个自然数,如果等于将它各个数位上的数字反向排列所得的自然数,这个数就是回文数。如12321,正着倒着念都一样。

回文数的算法,关键是怎样将原来的数反向排列并存储成另一个新的数,之后就可以通过比较两个数是否相等得到结果。假如用户输入一个旧的数old=123,我们可先将新的数new=0;运用整除运算先求出old的个位上数字3并使用new*10+3赋值给new,后将old/10,使他减掉最后一位数,再用同样的方法获得old当前的最后一位数2,再给new赋值:new=new*10+2,如此循环,下面我们介绍一种for循环的另一种写法:

因为输入的自然数位数不确定,因此分离数位的次数也不确定,但我们可以通过限定循环结束条件来使用,流程图和程序代码如下:

https://cdn.china-scratch.com/timg/181121/1112553038-2.jpg

#include    

using namespace std;

int main()

{

  int i,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;< p="">

  else cout<<"不是回文数"<<endl;< p="">

  return 0;

}

程序执行结果:

https://cdn.china-scratch.com/timg/181121/1112562R2-3.jpg

https://cdn.china-scratch.com/timg/181121/1112564361-4.jpg

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com