标签:避免 进制 image number 除法 images std char scanf
新手上路之我的水题之路
刚开始时,我首先想到的是定义一个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的帮助下(这次是马dalao与聚聚(∩_∩))告诉我由于
未告知数据范围,默认为1e6!!!!
那么在a*b的时候就有可能爆炸!!!
没办法,改算法(@﹏@)~
在大佬的提示下,自己写了个除法竖式体会了一下:
最初的算法是从最低位开始乘幂,但实际上从最高位开始会更简单;
定义int x=0;
x=x*base+每次的最高位是s [ i ];
再令 x=x%sum //sum是每位上数字之和;
原理就在于:
1234%6==34%6;
从最高位开始,将可以舍去的位数数字全部舍去,这样就避免了数字过大的问题
一下是好不容易AC的代码C(89)
#include <stdio.h> #include <string.h> 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; }
标签:避免 进制 image number 除法 images std char scanf
原文地址:http://www.cnblogs.com/mjhr/p/5995144.html