首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

ZOJ1154解决思路

2012-02-19 
ZOJ1154原题NivenNumbersANivennumberisanumbersuchthatthesumofitsdigitsdividesitself.Forexample,111is

ZOJ1154
原题


                                                                    Niven   Numbers


A   Niven   number   is   a   number   such   that   the   sum   of   its   digits   divides   itself.   For   example,   111   is   a   Niven   number   because   the   sum   of   its   digits   is   3,   which   divides   111.   We   can   also   specify   a   number   in   another   base   b,   and   a   number   in   base   b   is   a   Niven   number   if   the   sum   of   its   digits   divides   its   value.

Given   b   (2   <=   b   <=   10)   and   a   number   in   base   b,   determine   whether   it   is   a   Niven   number   or   not.


This   problem   contains   multiple   test   cases!

The   first   line   of   a   multiple   input   is   an   integer   N,   then   a   blank   line   followed   by   N   input   blocks.   Each   input   block   is   in   the   format   indicated   in   the   problem   description.   There   is   a   blank   line   between   input   blocks.

The   output   format   consists   of   N   output   blocks.   There   is   a   blank   line   between   output   blocks.


Input

You   will   be   given   a   number   of   test   cases.   Each   line   of   input   contains   the   base   b,   followed   by   a   string   of   digits   representing   a   positive   integer   in   that   base.   There   are   no   leading   zeroes.   The   input   is   terminated   by   a   line   consisting   of   0   alone.


Output

For   each   case,   print   "yes "   on   a   line   if   the   given   number   is   a   Niven   number,   and   "no "   otherwise.


Sample   Input

1

10   111
2   110
10   123
6   1000
8   2314
0


Sample   Output

yes
yes
no
yes
no


我的解...
#include   <stdio.h>
#include   <stdlib.h>
#define       N       100000
#include   <math.h>
#include   <string.h>
    char   str[N];
int   main()
{
        int   n;
   
        while(scanf( "%d ",   &n)> 0)
        {
if(n==0)
break;
scanf( "%s ",   str);
                int   i;
                int   sum1   =   0,   sum2   =   0;


                for(i=0;str[i]!= '\0 ';i++)
                {
                        sum1+=str[i]- '0 ';
                        sum2+=(str[i]- '0 ')   *   (double)(pow(n,strlen(str)-   i   -   1));
                }

                if(   sum2   %   sum1   ==   0)
                        printf( "yes\n ");
                else
                        printf( "no\n ");
        }

        return   0;
}
显示似乎是数组越界..可是有点不理解...还请大家指教




[解决办法]
应该是输入的数据可以很大(题目没有对大小作出限制),所以直接计算sum1有问题。
比如输入数据为
b a1a2...ak
可以首先计算
sum2=a1+a2+...+ak
然后计算
c1=a1
c2=(c1*b+a2)%sum2
c3=(c2*b+a3)%sum2;
...
ck=(c(k-1)+ak)%sum2;
然后判断ck是否是0来决定

热点排行