什么是开心数
通过计算一个数的各位数平方和的方式,当所有的平方和累加起来等于1时,这个数被称为开心数。
例如: 19 =》 1*1 + 9 *9 = 82 =》 8*8 + 2*2 = 68 => 6*6 + 8*8 = 100 => 1*1 + 0*0 + 0*0 = 1 最终结果是1 则说明19这个数是开心数
实现思路
数字每一位分离
如何分离一个数字的每一位数字哪?
/ 10 % 10 ;首先第一次 是 / 1 %10
后面依次是 / 10 %10 / 100 %10 / 1000 %10.
将一个变量 如 m 看成是 1 10 100 1000;就是 每次 分离后 m = m * 10;
s = (a / m ) % 10;
m *= 10;
s是每次的位数 a 是输入的数字;
循环求和
在每次位数确定后将每次位数的平方加和
sum += s*s;
完整的求取每一位并加和代码如下
for(i = 1;i <= count;i++) //循环求每一位的平方并加和
{
s = (a / m ) % 10;
m *= 10;
sum += s*s;
}
count是什么意思?count是位数决定循环的次数;
确定位数
while(x>=1) // 确定位数
{
x = x /10;
count++;
}
x是与输入的数相同的值 用来做确定位数的功能
循环求和判断
利用while循环当加和不是1时一直循环直到是1为止
while(sum != 1)
完整代码展示及结果示例
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int result= fun(n);
if(result == 1) // 判断result是否为1
{
printf("该数是开心数!");
}
else
{
printf("该数不是开心数!");
}
return 0;
}
int fun(int x) //传参数 x是形参
{
int sum = 0;
while(sum != 1){ / 循环判断计算sum是否是为1
int a = x;
int m = 1;
int count = 0;
int i = 1;
int s=0;
sum = 0;
while(x>=1) // 确定位数
{
x = x /10;
count++;
}
for(i = 1;i <= count;i++) //循环求每一位的平方并加和
{
s = (a / m ) % 10;
m *= 10;
sum += s*s;
}
x = sum;
}
return sum; // 返回
}