五道高精度题目中的最后一道了,终于可以结束高精度了。
说实话,高精度题目如果不用模板只是自己写的话做起来真的很恼火,可能是由于计算比较复杂吧,每次找出错误总要花很长时间。
回到这道题目,这是一道高精度除以单精度的题目(高精度除以高精度的还没做过),第一次由于不注意输出0的控制导致某些数据会输出了一大堆零000000... 果断WA一次,后来改了下控制了0的输出就过了...
还有一点,其实对于每一次输入,求商和模都在同一个运算过程之中(即对每一次输入,算出其商的同时模也算出来了),只是看要输出商还是模而已,不必分开来算的。
最后,还是要注意atoi,atol,atof这三兄弟的使用方法和使用范围啊!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 1000
char in[maxn],a1[maxn],res[maxn],a2[12],temp[12],ch;
long y;
void get()
{
int i,k;
for(i=k=0;in[i]!=' ';i++)
a1[k++]=in[i];
a1[k]='\0';
for(;in[i]==' ';i++);
ch=in[i];
for(i+=1;in[i]==' ';i++);
for(k=0;in[i]!='\0';i++)
a2[k++]=in[i];
a2[k]='\0';
}
void divide()
{
char temp[12];
int i,k,a1len=strlen(a1),a2len=strlen(a2);
int b=atoi(a2);
long c;
for(i=0;i<a2len;i++)
temp[i]=a1[i];
temp[i]='\0';
c=atol(temp);
for(k=0,i=a2len;i<a1len;i++)
{
y=c%b;
res[k++]=c/b+48;
c=(a1[i]-48)+y*10;
}
y=c%b;
res[k++]=c/b+48;
res[k]='\0';
if(ch=='/')
{
for(i=0;res[i]=='0';i++);
if(res[i]==0) printf("0\n");
else
puts(res+i);
}
else
printf("%ld\n",y);
}
int main()
{
while(gets(in)!=NULL)
{
get();
divide();
}
return 0;
}