读书人

ZOJ1154解决思路

发布时间: 2012-02-19 19:43:38 作者: rapoo

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来决定

读书人网 >软件架构设计

热点推荐