我编写了一个c ++代码,用于生成大小为10 ^ 9的数字的第一个和最后一个k位数。 (K< = 9)。
cin>>n>>k;
cout << (unsigned long)floor(pow(10.0, modf(n*log10((double)n), &dummy) + k - 1)) << " "; // code that prints the first k digits
long long int ans = foo(n,k); // function that prints the last k digits
if(ans==0)
{
for(int i=0;i<k;i++) cout << "0";
}
else{
stringstream ss;
string s;
ss<<ans;
ss>>s;
if(s.size()!=k)
{
for(int i=0;i<(k-s.size());i++)
s="0"+s;
}
cout<<s;
}
其中函数foo()是:
long long int foo(int n, int k) // code of the function
{
long long int m=1;
for(; k > 0; k--) m*=10;
long long int r=1, t=n % m;
while(n)
{
if (n % 2)
r = r * t % m;
t = t * t % m;
n >>= 1;
}
return r;
}
这给了我输出: 如果给出9和3作为输入,它给9的第一个和最后3个数字9(9 ^ 9),即387和489.但是我仍然错过了一些测试用例。 任何人都可以帮我找出我的代码无效的测试用例吗?
1≤n≤109,1≤k≤9 问题陈述:http://www.codechef.com/problems/MARCHA4/
答案 0 :(得分:2)
如果是n^n <= 10^9
,那么您的代码似乎工作正常。但是,如果您允许更大的n
,例如11^11
,并要求提供0611
的最后4位数,则您的代码只会打印611
。基本上,它不应该打印任何前导零。
答案 1 :(得分:1)
这并没有真正回答这个问题,而且它几乎简单易行,但我认为它可能值得分享。如果有“长评论”能力,我会使用它。
编辑:只是注意到使用str而不是repr将自己消除Ldef firstAndLastDig(k, num):
s = str(num)
return (s[:k], s[-k:])
def firstAndLastDigSelfExp(k,n):
return firstAndLastDig(k,n**n)
溢出不是问题(如果你使用repr而不是str,唯一的问题是处理L),
firstAndLastDigSelfExp(6,12)
('891610', '448256')
firstAndLastDigSelfExp(42,491)
('209417336844579728122309696211520194012462', '160453713040914743773217804810667483135091')
并且都不是领先的零
>>> firstAndLastDigSelfExp(4,9)
('3874', '0489')
这并不是说模块化日志和东西都不酷 - 相反,我真的很喜欢阅读你如何做到这一点而不产生整个数字。在阅读OP的问题之前我根本不知道modf,foo的主体非常有趣。
答案 2 :(得分:0)
我认为问题在于使用浮点数。找到数字的第一个数字实际上需要完美的精确度。
不幸的是,比赛裁判显然不明白“有效位数”!=“正确位数”。
也许有一些聪明的方法来精确计算(n * n,n = 10 * 9)而不会耗尽内存,但找到一个非常好的估计的第一个数字就不一样了找到答案的第一个数字。
答案 3 :(得分:-1)
假设k = 9
。现在,m = 1e9
和t <= 1e9 - 1
。
t * t
然后可能与1e18 - 2e9 + 1
一样高,需要...... 59.8位。
好吧,64位long long int
没有问题,它有63位数(和1个符号),但我会留在这里,所以其他人不会重复相同的分析。< / p>
答案 4 :(得分:-1)
您是否被告知n
是正整数?例如,(-8)^(-8)
在十进制中表达得非常好,但您的程序无法处理它。