算法题3

题目:


Problem Statement

 
***Note:  Please keep programs under 7000 characters in length.  Thank you


Class Name: SquareDigits
Method Name: smallestResult
Parameters: int
Returns: int

Define the function S(x) as the sum of the squares of the digits of x.   
For example: S(3)=3*3=9 and S(230)=2*2+3*3+0*0=13.

Define the set T(x) to be the set of unique numbers that are produced by
repeatedly applying S to x.  That is: S(x), S(S(x)), S(S(S(x))), etc... 
For example, repeatedly applying S to 37:
S(37)=3*3+7*7=58.  
S(58)=5*5+8*8=89.
S(89)=145.
S(145)=42. 
S(42)=20.
S(20)=4.
S(4)=16.
S(16)=37. 
Note this sequence will repeat so we can stop calculating now and: 
T(37)={58,89,145,42,20,4,16,37}.
However, note T(x) may not necessarily contain x.  

Implement a class SquareDigits, which contains a method smallestResult.  The
method takes an int, n, as a parameter and returns the smallest int, x, such
that T(x) contains n.

The method signature is (be sure your method is public): 
int smallestResult(int n); 

TopCoder will ensure n is non-negative and is between 0 and 199 inclusive.

Examples:
If n=0: S(0) = 0, so T(0)={0}, so the method should return 0.

If n=2: T(0) through T(10) do not contain the value 2.  If x=11, however:
S(11)=1*1+1*1=2, so T(11) contains 2, and the method should return 11.

If n=10: T(0) through T(6) do not contain 10.  If x=7:
S(7)=49.
S(49)=97.
S(97)=130.
S(130)=10.
S(10)=1.
and it starts to repeat... 
so T(7) is {49,97,130,10,1}, which contains 10, and the method should return 7.

n=1 -> x=1 
n=19 -> x=133
n=85 -> x=5
n=112 -> x=2666

Definition

 
Class:SquareDigits
Method:smallestResult
Parameters:int
Returns:int
Method signature:int smallestResult(int param0)
(be sure your method is public)
 
 

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.     


我的解法:


#include<iostream>

class SquareDigits{
public:
  SquareDigits(){};
  ~SquareDigits(){};
  int smallestResult(int param0){
    int i;
     for( i = 0; ;i++){
       int iNumber = setList(i);
       if( isIn(param0,list,iNumber)){
         break;
       }
     
     }
     return i;
  };

private:
  int bits[4];
  int list[200];
  int setList(int target){
    int _a = s(target);
    int i = 0;
    list[i] = _a;
    while(!isIn(_a = s(_a),list,++i)){
      list[i] = _a;
    }
    return i;
  };
  
  int split(int target){
    bits[0] = target / 1000;
    target = target % 1000;
    bits[1] = target / 100;
    target = target % 100;
    bits[2] =target / 10;
    target = target % 10;
    bits[3] = target;
    return 0;
  };
  
  int s(int target){
    split(target);
    return bits[0] * bits[0] + bits[1] * bits[1] + bits[2] * bits[2] + bits[3] * bits[3];
  };
  
  bool isIn(int target,int * start,int length){
    bool in = false;
    int i;
    for(i = 0; i < length;i++){
      if(target == *(start + i)){
       in = true;
        break;
        }
    }
    if(i == length )
       in = false;
    return in;
  };
 
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值