数字递增测试
Digit-increasing number test
如果数字等于n+nn+nnn+,则称为数字递增。。。对于1和9之间的某个数字n。例如,24是数字递增,因为它等于2+22(这里n=2)。
事实上,我的一个朋友问了我这个问题,我一直在思考,但到目前为止还没有找到确切的解决方案。有人能帮忙吗?我需要一个函数,如果是数字递增,则返回true,否则为false。
具有此属性的数字相对较少:在unsigned long long
(64位)的范围内,只有172个数字递增。
因此,就实际解决方案而言,预先计算所有并将其放入哈希中是有意义的。以下是Python代码:
# Auxiliary function that generates
# one of the 'nnnn' elements
def digits(digit,times):
result = 0
for i in range(times):
result += digit*(10**i)
return result
# Pre-computing a hash of digit-increasing
# numbers:
IncDig = {}
for i in range(1,30):
for j in range(1,10):
number = reduce(lambda x,y:x+y,[digits(j,k) for k in range(1,i+1)])
IncDig[number] = None
那么实际的检查功能只是在散列中查找:
def IncDigCheck(number):
return (number in IncDig)
这实际上是O(1),并且预计算所花费的时间和空间是最小的,因为只有9个不同的数字(零不算数),因此对于长度为K
的和,只有类型为n + nn + ...
的K*9
组合。
一般表示为:
n+(n*10+n)+(n*100+n)。。。
如果数字看起来像相同数字的总和,那么任何数字都可以表示为
(1+111+…)*base_digit
。假设这样,我们可以使用简单的算法:
bool isDigitIncreasing(const int num)
{
int n = 1;
int sum = 1; //value to increase n
while (n <= num) {
//if num is (111...) * base_digit and base_digit is < 10
if (num % n == 0 && n * 10 > num) return true;
sum = sum * 10 + 1; //N*10+N where n is 1 as was assumed
n += sum; //next step
}
return false;
}
简单的详尽搜索就可以了。
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
最简单的方法是进行加法(自下而上),我将使用simple-for-loop:
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)
算法。
这是一个python代码。这里的基本逻辑是,一个数字递增的数字,如果除以1-9之间的特定数字,就会得到一个只有1的数字递增数字。所有数字递增的数字1都遵循特定的模式,即12345678…
import sys
for n in range(1,10):
a=1
if k%n!=0:
a=0
else:
g=str(k/n)
j=int(g[0])
for i in range(1,len(g)):
if int(g[i])==j+1:
j=int(g[i])
else:
a=0
break
if a==1:
print "Yes,it is a digit increasing number"
sys.exit(0)
print "No,it is not a digit increasing number"
我就是这样做的。退房一次。
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;
}
以下是的最短解决方案
public static int isDigitIncreasing (int n)
{
if(n<10)
{
return 1;
}
for(int i=1;i<=9;i++)
{
int tempsum=i;
int previous=i;
while(tempsum<=n)
{
previous=previous*10 + i;
tempsum=tempsum + previous;
if(tempsum==n)
{
return 1;
}
}
}
return 0;
}
歧义:值1-9本身是否重复?(懒得自己用谷歌搜索)
如果1-9重复,则以下内容应该有效。如果不是,并且您希望代码仅适用于值>10,则可以使用10初始化mult
。
int i, mult = 1, result, flag;
for( i=1; i<9; i++ )
{
flag = 0;
while( result < TARGET )
{
result = result+(i*mult);
mult = mult*10;
if( result == TARGET )
{
flag = 1;
break;
}
}
if( flag == 1 )
break;
}
执行后,如果flag
为1,则i
必须包含RESULT为重复数的值。如果标志在执行后为零,则TARGET不是一个重复数字。
我想知道一个数字是否可能对多个值重复,只是好奇。
这里num
是数字,n
是数字
#include<stdio.h>
int f(int num,int n)
{
int d=n;
while(num>0)
{
num-=n;
n=d+n*10;
}
if(num==0)
return 1;
else
return 0;
}
int main()
{
int num;
int n;
int flag;
printf("Enter the number :");
scanf("%d",&num);
printf("Enter the digit :");
scanf("%d",&n);
flag = f(num,n);
if(flag == 1)
printf("It's in n+nn+nnn+...n");
if(flag ==0)
printf("It's notn");
return 0;
}
设d(k)为1+11+111++(11…11),其中最后一个数字有k个数字。则d(1)=1,并且d(k+1)=10d(k)+k+1。
我们想要测试d(k)*i=n,对于某些k,以及对于某些i=1..9。
如果我们已经计算了d(k),那么i(如果它存在)必须是n/d(k)。我们可以通过将n与((n/d(k))%10)*d(k。如果i大于9,%10将使测试失败。
这为我们提供了一个相对简洁的解决方案:计算后续的d(k),直到它们大于n,并在每个点检查n是否是d(k)的数字倍。
下面是这个想法的一个非常简单的代码实现:
#include <stdio.h>
int is_digit_increasing(int n) {
for(int d=1,k=1;d<=n;d=d*10+ ++k)if(n==(n/d)%10*d)return 1;
return 0;
}
int main(int argc, char**argv) {
for (int i=0; i<10000; i++) {
if (is_digit_increasing(i)) {
printf("%dn", i);
}
}
return 0;
}
// Example program
#include <iostream>
#include <string>
int isDigitIncreasingNo(int n) {
if(n<=0)
return 0;
int len = std::to_string(n).length();
int vector1 = 0;
int vector2 = 0;
for(int i=1;i<=len;i++)
vector2 = (vector2*10)+i;
vector1 = vector2/10;
if(n % vector2 == 0 && (n / vector2)<=9 )
return 1;
if(n % vector1 == 0 && (n / vector1)<=9 )
return 1;
return 0;
}
int main()
{
for (int i=0; i<10000000; i++) {
if (isDigitIncreasingNo(i)) {
printf("%dn", i);
}
}
return 0;
}
public boolean isDigitIncreasing(int number)
{
int sum;
int size=calculateNumberOfDigits(number);
for(int i=1;i<=9;i++)
{
sum=0;
int temp=size;
while(temp>=1)
{
for(int j=temp;j<=1;j--)
{
sum=sum+i*(int)Math.pow(10,j-1);
}
temp--;
}
if(sum==number)
{
return true;//Its a digit increasing
}
}
return false;
}
public int calculateNumberOfDigits(int number)
{
int size=0;
do
{
number=number/10;
size++;
}while(size>0);
return size;
}
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 为什么使用所有数字来测试素数比仅使用素数更快
- 如何测试某些数字是否沿区间均匀分布?
- 为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试
- 测试结果乘加减除法可能为一组数字
- 测试字符串是数字还是字符
- 数字递增测试
- 测试一个数字是否具有小数值,而没有任何库
- 有没有一种方法可以测试一个输入是否是C++中的数字
- 如何使用switch语句(C++)测试一个数字是素数还是可被7整除
- 这段代码有什么问题?如果变量是字母,我无法测试名为数字的变量
- 如果int是数字c++,则测试将其转换为char
- 使用不同的函数(C++)测试一个数字是否是回文
- 测试字符串是否以数字开头
- c++ cin.ignore忽略空格、数字和字符来测试回文
- 测试检查该方法返回一个数字范围
- 测试给定的数字是否为整数
- if语句-测试字符串或字符的大写,小写和数字