题目描述:
编写一个算法来确定一个数字是否是“理想数”。 快乐的数字按照如下方式确定:从一个正整数开始,用其每位数的平方之和取代该数,并重复这个过程,直到最后数字要么收敛等于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 循环获取字符串类型数字的每一位来计算平方和。
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()
原文地址:https://www.cnblogs.com/leime/p/9463140.html
时间: 2024-10-31 12:46:19