题目描述:
编写一个算法来确定一个数字是否是“理想数”。 快乐的数字按照如下方式确定:从一个正整数开始,用其每位数的平方之和取代该数,并重复这个过程,直到最后数字要么收敛等于1且一直等于1,要么将无休止地循环下去且最终不会收敛等于1。能够最终收敛等于1的数就是“理想数”。
例如:19是一个“理想数”,计算过程如下:
- 1^2+9^2=82
- 8^2+2^2=68
- 6^2+8^2=100
- 1^2+0^2+0^2=1
要求:
当输入理想的数字时,输出True,否则输出False。
思路:
方法一(c语言实现):
1. 不理想的数字最终会在 [4,16,37,58,89,145,42,20] 这些数字中无限循环,因此可以加入判断,当数字变为这些数字里的任意一个(比如4)时就结束循环,输出False,从而避免无限循环的产生。
2. 理想数都会收敛于1。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int car = 1;
int num = 0;
int tmp = 0;
while (car == 1)
{
printf("请输入一个数字:\n");
scanf("%d", &num);
while ((num!=1)&&(num!=4))
{
while (num!=0)
{
tmp += (num % 10)*(num % 10);
num /= 10;
}
num = tmp;
tmp = 0;
}
if (num==1)
{
printf("True\n");
}
if (num==4)
{
printf("False\n");
}
}
getchar();
getchar();
return 0;
}
方法二(python语言实现):
1. 不理想的数字最终会在 [4,16,37,58,89,145,42,20] 这些数字中无限循环,因此可以加入判断,当数字变为这些数字里的任意一个(比如4)时就结束循环,输出False,从而避免无限循环的产生。
2. 理想数都会收敛于1。
var = 1
while var == 1: #制作一个循环,可以反复输入数字来判断是不是“快乐的数”
a = input() #输入一个正整数
while (a != 1 and a != 4): #当a不等于1或者4时,一直计算平方和
num = list(str(a)) #读取输入数字的每位数制成列表
a = 0 #初始化a,用于计算每位平方和。此时a值已保存在num里,无需担心丢失。
for i in num: #遍历num列表中所有数值,计算出每位数平方和
a = a + int(i)**2
print(a) #打印出当次计算的平方和
if(a == 1): #当a等于1时,判断为“快乐的数字”,打印“True”
print('True')
else: #当a不等于1时,打印“False”(其实不是1就是4)
print('False')
方法三(python语言实现):
1. 当输入的不是理想数字时,会陷入一个无限循环,因此增加一个计数器 count 用来统计计算次数。设定当 count 达到2000次时,认为该数字不是理想数字,跳出循环结束计算。(可以优化算法解决这一问题)
2. 因为不确定输入的数字会是几位数,因此不采用除法和取模的方法来获得数字的每一位数,而是利用 for 循环获取字符串类型数字的每一位来计算平方和。
#判断理想数字
def getSumofSquares(num):
numStr=str(num) #将待计算的数字转换成字符串类型
sum=0
digitls=[int(x) for x in numStr] #从字符串中提取出每一位数字存入一个列表
#print(digitls)
for i in digitls:
sum += i**2
return sum
def main():
n = input() #输入一个正整数
sumofSqrs = eval(n)
count = 0
while sumofSqrs != 1:
sumofSqrs = getSumofSquares(sumofSqrs)
count += 1
if count > 2000: #当计算次数超过2000次时,跳出循环结束计算
print("False")
break
else:
print("True")
main()