如果整数大于0,并且其十进制表示形式的数字之和为10的倍数,则为整数。找到第N个最小的整数。
1≤N≤10^ 18
我尝试过幼稚的方法,但是对于较大的约束,该解决方案无法正常工作。
#include <bits/stdc++.h>
using namespace std;
int sumOfDigits(int n)
{
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
int findNum(int n)
{
int c=0, num=0;
while (c != n) {
num++;
int sum = sumOfDigits(num);
if (sum % 10 == 0)
c++;
}
return num;
}
int main()
{
int t, n;
cin>>t;
while(t--){
cin>>n;
cout<<findNum(n)<<endl;
}
}
是否有解决此问题的好方法。请不要粘贴整个解决方案,我只想要解决这个问题的方法。
我也尝试了另一种方法..但是该解决方案无法正常工作。
public static long findNth(int n)
{
long nthElement = 19 + (n - 1) * 9;
int outliersCount = (int)Math.log10(nthElement) - 1;
nthElement += 9 * outliersCount;
return nthElement;
}
会有系列形式:19、28、37、46、55、64 .....但是记住要删除100、1000 ...以此类推。
考虑到这一点,我已经尝试了上面的解决方案,但是它不起作用。
我正在使用一种回答的方法。但这也不行。.
int sumOfDigits(int n)
{
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
if(sum%10==0) return 0;
else if(sum<10) return 10-sum;
return 10-sum%10;
}
long long findNum(int n)
{
return n*10+sumOfDigits(n);
}
答案 0 :(得分:3)
一个重要提示:如果n-1
位整数的前n
位数字是固定的,则恰好有一个数字可以用作满足条件的最后一位数字。换句话说,每10个整数(从10开始)中恰好有一个整数满足要求的条件。基于此,有一个非常简单的解决方案,直接生成答案,而不是一一枚举整数并验证条件。
答案 1 :(得分:2)
尝试在满足此条件的数字中找到一些模式,您将找到比迭代每个数字更有效的解决方案。
答案 2 :(得分:2)
如果您查看满足此条件的数字
19,28 ... 91,109,118 ... 190,208,217 ... 280,299,307 ... 370,389,398,406 ... 460,479 ... 497 ,505 ... 550,569 ... 596,604 ... 640,659 ... 695,703 ... 730,749 ... 794,802 ... 820,839 ... 893,901 ,910、929 ... 992、1009 ...
您会看到相邻的整数之间的距离通常是9(无论我何时在上面打印“ ...”)。但是,差距更大(例如280和299之间),差距更小(例如794和802之间)。仔细检查发现,小于N(k)
的整数k
满足:
N(100) = 9;
N(1000) = 99;
N(10000) = 999; etc.
您可能要验证这一点并找到任意大数的模式。然后,您可以使用该结果以最多k(N)
个步骤来找到反函数,即log(N)
,这就是您的答案。