大家好我在一些网站上发现了这个问题
Spade是一位非常优秀的侦探,但他并不擅长数学,这次他的朋友Archer带着一个非常有趣的数学问题来找他。给定两个数字1 <= N <= 10 ^ 9且1 <= M <= 100,具有长度N的多个正数具有可被M整除的其数字的总和.Archer非常痴迷并且不想要带有前导零的数字。 Spade聘请你来解决这个问题,现在他的声誉已经掌握在你手中了。
输入包含一行,其中两个数字N和M由单个空格分隔。
输出单行,并解答问题模块1000007。
2 2
45
虽然我得到了预期的输出但它不接受我的回答。任何人都可以指出代码中的错误。
#include <stdio.h>
int main(void)
{
int n,m,i,firstnum=1,count=0,lastnum=0,j=0,no=0;
scanf("%d",&n);
if (n>=1) {
scanf("%d",&m);
if (m>=1 && m<=100)
{
for (i=1;i<n;++i) {
firstnum*=10;
++count;
}
for (i=0;i<=count;++i)
lastnum=lastnum*10+9;
if (firstnum%m==0)
++no;
for (i=++firstnum;i<=lastnum;++i) {
j=i;
int sum=0,r;
do {
r=j%10;
sum+=r;
j=j/10;
} while(j);
if (sum%m==0)
++no;
}
}
}
printf("%d",no-1);
return 0;
}
答案 0 :(得分:2)
你试图通过蛮力解决这个问题,这对于所涉及的规模不会起作用。多个长度10 ^ 9可以达到10 ^(10 ^ 9),这是一个不太适合int
甚至long long int
的数字。即使这样做,试图逐一列举这个长度的所有数字也需要数十亿年。
您需要提出一种不会逐个查看数字的方法。就像你可以计算出1到100之间有33个可以被3整除的数字而不是全部查看它们,你需要在这里提出这样的方法。但是在这里它会更难,因为你需要在没有实际计算10 ^ n的值的情况下这样做。
答案 1 :(得分:1)
您的方法实际上并不正确。 你已宣布&#34; firstnum&#34;变量为int,即它不能保持大于2 ^(32-1)的值(在大多数在线判断上)。 n的最大值在10 ^ 9,因此你试图在最坏的情况下放置10 ^(10 ^ 9)。
我希望你有我的观点。我想要你可以在我的答案下方评论的方法。我不想为你破坏这个问题。 :)