信息学奥赛之c++算法(三)水仙花数、回文数
2018-11-19 11:12
水仙花数:指一个三位数,数字本身等于各个位数上的立方之和。如153=
13+53+33,要求水仙花数,首先要学会分离百位、十位、个位上的数。用153/100可以得到百位上的数,(153/10)%10或(153%100)/10可得到十位上的数字,153%10可以得到个位上的数字。之后通过遍历100--999之间所有的数,对每一个数进行计算和判断,程序的流程图如下:
如果要计算水仙花数的个数,可以加一个统计变量,程序代码如下 : #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; } 程序运行结果:
再来看回文数:任意一个自然数,如果等于将它各个数位上的数字反向排列所得的自然数,这个数就是回文数。如12321,正着倒着念都一样。
回文数的算法,关键是怎样将原来的数反向排列并存储成另一个新的数,之后就可以通过比较两个数是否相等得到结果。假如用户输入一个旧的数old=123,我们可先将新的数new=0;运用整除运算先求出old的个位上数字3并使用new*10+3赋值给new,后将old/10,使他减掉最后一位数,再用同样的方法获得old当前的最后一位数2,再给new赋值:new=new*10+2,如此循环,下面我们介绍一种for循环的另一种写法:
因为输入的自然数位数不确定,因此分离数位的次数也不确定,但我们可以通过限定循环结束条件来使用,流程图和程序代码如下:
#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; }
程序执行结果:
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com