ZOJ 1154 Niven Numbers

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1154

 

题意: 提供一系列数以及各自的进制数,请判断每个数是否能被 每个位上的数字只和 整除。

解题思路:首先把除数,也就是每个位上面的数字加起来,然后把数字转成十进制,取余一下,OK。

我在代码中做了几处优化,防止计算溢出:

1. 转化为十进制时,每个位上的数会乘以一个相应的基数,我把这些基数先取余了一下(baseMod

数组)

2. 转化为十进制,每位上的数乘以baseMod之后,相加之前,先取余。现在看看,这个貌似有点多余了。

至于为什么能那么做,自己找取余计算公式去吧。

代码:

#include <iostream> #include<stdio.h> using namespace std; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout); #endif int loop; int base; int divide; long divided; long baseMod[100]; string s; cin >> loop; while(loop--) { cin >> base; while(base) { cin >> s; divide = 0; divided = 0; for(string::iterator it = s.begin(); it<s.end(); it++) { divide += *it - '0'; } baseMod[0] = 1; int len = s.size(); for(int i=1;i<len;i++) { baseMod[i] = (baseMod[i-1]*base)%divide; } for(int i=0;i<len;i++) { divided += ((s[i]-'0')*baseMod[len-i-1])%divide; } if(divided%divide) { cout << "no" <<endl; } else { cout << "yes" <<endl; } cin >> base; } if(loop) cout << endl; } return 0; }  

你可能感兴趣的:(优化,String,iterator,Numbers)