C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)

简介: C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)

一.水仙花数(阿姆斯壮数)

1.水仙花数定义

2.代码实现

虽然定义上水仙花数是一个三位数,我们这里要说的代码是一个能求任意范围内的水仙花数的代码。

根据定义,我们知道水仙花数每个位上的数字的该数位数的次幂和等于该数,那么要求水仙花数,就要得先知道该数是几位数。

那怎样求得位数呢?

我们知道求个位上的数字只需拿该数%10就行了,然后再/10,就丢掉了个位,以此类推,很显然,这是一个循环结构,这时我们定义一个记录位数变化的变量n ,每次进入循环时就count++;那么问题来了,怎么控制循环的开始与结束?数字嘛,至少是一位数,而一位数的数字/10=0,因为0为假,非0为真,恰好可以利用这一点来控制循环,具体代码:

1. int main()
2. {
3.  int i = 0;
4.  int n, m;
5.  printf("请输入范围:>");
6.  scanf("%d %d", &n, &m);
7.  for(i=n;i<=m;i++)
8.  {
9.    n = 1;    //初始值是1
10.     int tmp = i;    //使用i但不改变i
11.     int sum = 0;    //循环完一遍后使sum=0,判断下一次水仙花数
12.     while (tmp / 10 != 0)    //控制循环
13.     {
14.       n++;    //记录位数
15.       tmp = tmp / 10;
16.     }
17. 
18.   }
19.   return 0;
20. }

上面代码中的 int sum=0,不能丢,也不能定义成其他的数。位数知道了,接下来就是看每一位的位数幂次方之和是否等于 i 就行了。

可以在嵌套一个循环,定义一个变量并初始化 int sum=0; ,具体代码:

1. int count = n;    //使用n但不改变n
2.    for (tmp = i; count > 0; count--)    //求每位数n次幂加起来的和
3.    {
4.      sum = sum + pow(tmp % 10, n);    
5.      tmp = tmp / 10;
6.    }
7.    if (sum == i)    //判断水仙花数
8.    {
9.      printf("%d ", i);
10.     }

全部代码:

二.回文数

1.回文数定义

2.代码实现

回文数正着读倒着读都一样,所以我们如果能判断第1个数字和最后1个数字相同,第2个数字和倒数第2个数字相同.......如果是位数是奇数的话,那中间的数字是不需要判断的,偶数的话,判断前半段和后半段对应的数字相同即可。

好的思路有了,就可以开始写代码了,首先判断位数,这在水仙花数的判断里已经详细讲过了,在这里就不赘述了,详情参照上文。

从思路中我们知道,要判断是否是回文数,需要使用到前面和后面的数字,但不能改变原来的数,所以我们得分别定义两个变量,之后也会用到位数,同理也不能改变位数,所以又需要一个变量,具体变量定义请看下图:

前半部分代码:

1. int main()
2. {
3.  int n, m; //输入范围
4.  int i,j, count; //i产生n - m之间的数,count记录位数
5.  int tmp1, tmp2; //tmp1使用前面的数,tmp2使用后面的数
6.  printf("请输入范围:>");
7.  scanf("%d %d", &n, &m);
8.  int flag = 0;
9.  for (i = n; i <= m; i++)
10.   {
11.     count = 1;  //计算位数
12.     tmp1 = i;
13.     while (tmp1 / 10 != 0)
14.     {
15.       count++;
16.       tmp1 = tmp1 / 10;
17.     }
18. 
19.   }
20.   return 0;
21. }

最关键的部分我们用循环实现。

通过前面的分析我们发现其实不管位数是奇数还是偶数,最终只需要循环 位数的一半,循环一次比较一对数字,所以循环 count/2 次,同理又需要一个新变量来使用 count/2。

要比较一对数字,后面的数字的求法已经在上文提到了,即先%10,再/10;那前面的数字怎么求呢?

比如说123,怎么获取到1呢?

不难发现其实只需要拿123/100就行了,然后123%100得到了23,再拿23/10.......以此类推。

具体代码请看下图:

红框里的都是值得注意的地方。

1红框在上文已经提到;

2红框:如果我们直接把 tmp1/(pow(10,j-1))写在 if 判断中,那最后得到的结果就是错误的;

3,5红框用来判断是不是回文数,如果是的话,那么 flag==count2; 因为如果是回文数的话,那么每一对数字的比较都会进如第1个 if 语句中,循环几次 flag 就等于几;

4红框:为什么这么写呢?直接写成 tmp1=tmp1%pow(10,j-1) 不行吗?

我们来看看 pow 函数的定义:

可以看到 pow 函数的返回值类型是 double ,而%操作符两边的操作数必须是整数,所以才像4红框中那样写。

完整代码:

1. int main()
2. {
3.  int n, m; 
4.  int i,j, count; 
5.  int tmp1, tmp2; 
6.  printf("请输入范围:>");
7.  scanf("%d %d", &n, &m);
8.  int flag = 0;
9.  for (i = n; i <= m; i++)
10.   {
11.     count = 1; 
12.     tmp1 = i;
13.     flag = 0;
14.     while (tmp1 / 10 != 0)
15.     {
16.       count++;
17.       tmp1 = tmp1 / 10;
18.     }
19.     int a = count / 2;
20.     for (j=count,tmp1=i,tmp2=i; a > 0; j--,a--)
21.     {
22.       int b1 = tmp1 / (pow(10, j - 1));
23.       if(b1==tmp2%10)
24.       {
25.         flag++;
26.         int p1 = pow(10, j-1);
27.         tmp1 = tmp1 % p1;
28.         tmp2 = tmp2 / 10;
29.       }
30. 
31.     }
32.     if (flag == count / 2)
33.     {
34.       printf("%d ", i);
35.     }
36.   }
37.   return 0;
38. }

一串数字的位数计算方法:

每一位数字的计算方法:

1.从前先后:

先 除10的位数次方,然后取模10的位数次方。

下面是一个6位数的例子:

2.从后向前:

先%10再/10。

例:

       😸本篇文章到此结束啦,如有错误或是意见,欢迎小伙伴们的提出。

       🐯谢谢你的阅读


目录
相关文章
|
17天前
|
存储 算法 安全
C 语言中的位运算:挖掘底层计算的高效力量
位运算是C语言中直接操作二进制位的一种技术,能高效处理底层数据,广泛应用于优化算法、硬件编程等领域,是掌握C语言高级特性的关键之一。
|
15天前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
27 5
|
19天前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
56 4
|
2月前
|
C语言
【C语言】三位数(1-4)不重复组合
【C语言】三位数(1-4)不重复组合
|
6月前
|
存储 C语言
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
|
6月前
|
C语言
C语言实现水仙花数与99乘法表
C语言实现水仙花数与99乘法表
|
6月前
|
存储 安全 C语言
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
|
6月前
|
存储 C语言
【C语言刷题每日一题】——计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
【C语言刷题每日一题】——计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的C语言在线评测系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的C语言在线评测系统附带文章源码部署视频讲解等
50 0
|
6月前
|
C语言
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)