如果一个数等于n+ nn + nnn + ...对于1到9之间的某个数字n。例如,24是数字递增的,因为它等于2+ 22 (这里n= 2)。
实际上,我的一个朋友问了我这个问题,我一直在思考这个问题,但到目前为止还找不到确切的解决方案。有人能帮上忙吗?我需要一个函数,如果它是数字递增的,则返回true,否则返回false。
发布于 2012-10-30 17:51:52
我就是这样做的。退房一次。
int sum = 0, count =0;
bool flag = false;
public bool isDigitIncreasing(int input_number)
{
int n= get_number_of_digit(input_number); // Gets number of digits
int sum = 0;
for(int i=0;i<n;i++)
{
sum = sum*10+1;
count = count + sum;
}
for(int i=1; i<=9;i++)
{
if((input_number)==count*i)
{
flag = true;
break;
}
else
flag = false;
}
return flag;
}
public int get_number_of_digit(int num)
{
int size = 0;
do
{
num = num/10;
size++;
}while(num>0);
return size;
}
发布于 2012-10-30 17:14:59
简单的穷举搜索将会起作用。
def is_digit_increasing_number(x):
# n = 1, 1+11, 1+11+111, ...
n = 1
i = 1
while n <= x:
if x % n == 0 and n * 10 > x:
return True
i += 1
n = n * 10 + i
return False
发布于 2012-10-30 17:17:26
最简单的方法是做加法(自下而上),我将使用简单的for循环:
List<int> numbersSum = new List<int>{1,2,3,4,5,6,7,8,9};
List<int> lastNumber = new List<int>{1,2,3,4,5,6,7,8,9};
for(int i=0;i<= lg n + 1;i++)
{
for(int j=0;j<9;j++)
{
if(list[j] < n)
{
var lastNumberJ = lastNumber[j]*10+j+1;
list[j] += lastNumberJ; // add numbers to see will be same as n.
if (list[j] == n)
return j+1;
lastNumber[j] = lastNumberJ;
}
}
}
return -1;
重要的是你只需要最多的log n
迭代,而且如果所有的数字都大于给定的数字,你可以更快地返回,这就是O(log n)
算法。
https://stackoverflow.com/questions/13134310
复制相似问题