hoj 1014 Niven Numbers
Posted 浩小浩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于hoj 1014 Niven Numbers的主要内容,如果未能解决你的问题,请参考以下文章
[Algorithm] A nonrecursive algorithm for enumerating all permutations of the numbers {1,2,...,n}(代码片
c_cpp HOJ - 302:最大平均值[AC]; http://hoj.twbbs.org/judge/judge/submission/21872