比特大陆面试“判断是否是理想数”代码分享

题目描述: 

编写一个算法来确定一个数字是否是“理想数”。 快乐的数字按照如下方式确定:从一个正整数开始,用其每位数的平方之和取代该数,并重复这个过程,直到最后数字要么收敛等于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()

猜你喜欢

转载自www.cnblogs.com/leime/p/9463140.html