自动在线评判拒绝我的数学难题解决方案

时间:2015-03-06 12:30:08

标签: c loops

大家好我在一些网站上发现了这个问题

描述

  

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;
}

2 个答案:

答案 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)。

我希望你有我的观点。我想要你可以在我的答案下方评论的方法。我不想为你破坏这个问题。 :)