HOJ 1014 Niven Numbers

新手上路之我的水题之路

刚开始时,我首先想到的是定义一个int数组,然后让输入的数字从最低位开始在循环不断地*base,从而将

k进制转化成十进制;然后再作取模判断就可以了;

这时在将最低位到最高位依次乘以相应的n次幂是,需要知道读入数字的位数:

while(t>0)
{
    n++;  //n是最后得到的数字位数;
    t=t/10; //t是输入的数字;
}

  然后得到了k进制转化成十进制的简单代码:

 int main()

{
   int i,j,a,b,c,t,sum=0,n=0;
   scanf("%d %d",&c,&b);
   t=c;
   while(t>0)
   {
          n++; 
          t=t/10; 
   }
   t=c;
   for(i=1; i<=n; i++)
   {
    a=t%10;
    t=t/10;
    for(j=1; j<i; j++)
   {
       sum+=a*b;
     }
   }
   sum+=c%10;
   printf("%d\n",sum);
  return 0;
}

但是用这样的想法得到的代码一直是WA;

后来,经过一阵刻骨铭心的检查,发现应该使用字符串来读入数字;

 这就有一个问题:

 数字字符如何转化为数字来进行四则运算?

 经过dalao的帮助,找到了s [ i ] - ' 0 ';来实现转化;

可是,用字符串改了之后一样不过!!!!!!!!

然后,又是在dalao的帮助下告诉我由于

未告知数据范围,默认为1e6!!!!

那么在a*b的时候就有可能爆炸!!!

没办法,改算法(@﹏@)~

在大佬的提示下,自己写了个除法竖式体会了一下:

 最初的算法是从最低位开始乘幂,但实际上从最高位开始会更简单;

 定义int x=0;

 x=x*base+每次的最高位是s [ i ];

再令 x=x%sum //sum是每位上数字之和;

原理就在于:

   1234%6==34%6; 

  从最高位开始,将可以舍去的位数数字全部舍去,这样就避免了数字过大的问题

一下是好不容易AC的代码C(89)

char s[10000010];
int main()
{
    int b,n,i,j,q,t;
    while(scanf("%d",&b)==1&&b!=0)
    {
        scanf("%s",s);
        n=strlen(s);
        q=0;
        t=0;
        for(i=0; i<n; i++)
        {
            q+=s[i]-'0';
        }
        for(i=0; i<n; i++)
        {
            t=t*b+(s[i]-'0');
            t=t%q;
        }

        if(t%q==0)
        {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }
    return 0;
}
posted @ 2016-10-26 12:43  浩小浩  阅读(533)  评论(0编辑  收藏  举报