倒数问题

来源:互联网 发布:js数组按数字大小排序 编辑:程序博客网 时间:2024/06/10 02:38

问题描述


一个正整数的倒数是1除以那个整数。举例来说,37 的倒数是 1/37。有些正整数的倒数是可以用十进制的有限不循环小数表示的,这些正整数包括:

  • 10 的幂;
  • 2 的幂;
  • 2 的幂并跟着数个 0;
  • 5 的幂;
  • 5 的幂并跟着数个 0。

你的任务是求出这样一些整数的倒数,并用十进制表示出来。

输入

输入的第一行是要处理的正整数的个数,后面每一行输入一个正整数。每一个正整数都符合以下条件:

  • 都会从行首开始,
  • 其第一列的数字不为 0,
  • 最多包含 72 个数字。

输出

对于每一个正整数,输出以精确的十进制表示的该数的倒数。每个结果一行。


测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. 4↵
  2. 4↵
  3. 100↵
  4. 6250000↵
  5. 10485760↵
以文本方式显示
  1. 0.25↵
  2. 0.01↵
  3. 0.00000016↵
  4. 0.000000095367431640625↵
1秒64M0
题解思路

大致思路:

对于给出的数字,去掉后面的0之后只可能会出现三种情况就是1,2的幂,5的幂。然后对于1,就直接输出1;对于2的幂的倒数可以这样计算,以8为例,1/8=(1/(2*5*2*5*2*5))*5*5*5,意思就是如果不看小数点的话,8的倒数的大小就是5的3次方,什么原因呐,因为我们采用的是10进制,2*5=10,所以上面的方法就是成立。所以对于2的幂的倒数不考虑小数点就是5的相应次方,5的幂的倒数就是2的相应次方。这样就可以把倒数的值计算出来,剩下的事儿就是判断小数的位数。

具体实现:

数字比较大,所以要采用高精度的方法。先去掉数字后面的0,出掉之后可以直接输出相应的0也可以不做操作在最后的时候判断小数到底有多少位,再输出相应个数的0。然后就是判断剩下的数是什么情况,如果是1就直接判断小数位数输出相应个数的0然后输出1;如果剩下的数的最后一位是5那就说明这个数是5的幂,这时就需要用高精度除法计算出这个数是5的多少次方,计算出来之后再计算2的相应次方(这里5的次方数和2的次方数是一样的)就可以得到倒数后面的值,然后计算这个数的倒数的小数位数,输出相应个数的0再将2的相应次方输出即可。剩下的数就是2的幂处理方法和5的幂是一样的。

注意事项:

(1)倒数的小数位数的计算,对于2的幂(后面有0),小数位数就是2的次方数(加上0的个数);对于10的幂,小数位数就是后面0的个数。

(2)高精度除法自己手推一下就出来了,跟乘法相似,只是乘法从各位开始,而除法从最高位开始。


实现代码


<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>#include<string.h>char yuan[100];int cheng[1000];void chu(char *x,int d){int m,len,yy,zz=0;int a[100];memset(a,0,sizeof(a));len=strlen(x);for(m=0;m<len;m++){a[m]=x[m]-48;}for(m=0;m<len;m++){if(a[m]<d){a[m+1]+=a[m]*10;a[m]=0;continue;}yy=a[m]%d;a[m+1]+=yy*10;a[m]=a[m]/d;}for(m=0;m<len;m++){if(a[m]!=0){zz=m;break;}}for(m=0;m<len-zz;m++){x[m]=a[m+zz]+48;x[len-zz]='\0';}}void chen(int  *x,int y){int k;int length=999;while(x[length]==0&&length>0){length--;}length ++;for(k=0;k<length;k++){x[k]=x[k]*y;}length++;for(k=0;k<length;k++){x[k+1]+=x[k]/10;x[k]=x[k]%10;}} int main(){//int cheng[80];int n,i,j,k,length,length1,length2,count,count2,count5,temp,p;scanf("%d",&n);for(i=0;i<n;i++){memset(yuan,-1,sizeof(yuan));memset(cheng,0,sizeof(cheng));cheng[0]=1;count=0;count2=0;count5=0;temp=0;length1=0;length2=0;scanf("%s",yuan);length=strlen(yuan);if(yuan[0]=='1'&&length==1){printf("1\n");}else{printf("0.");for(j=length-1;yuan[j]=='0';j--){count++;yuan[j]='\0';}if(count>0){for(k=1;k<count;k++){printf("0");}if(yuan[j]=='1'){printf("1\n");}else if(yuan[j]=='5'){while(strcmp(yuan,"1")!=0){ chu(yuan,5); chen(cheng,2);count5++;}for(p=999;cheng[p]==0;p--){length1=p;}temp=count5-length1+1;for(k=1;k<=temp;k++){printf("0");}for(k=length1-1;k>=0;k--){printf("%d",cheng[k]);}printf("\n");}else{while(strcmp(yuan,"1")!=0){ chu(yuan,2); chen(cheng,5);count2++;}for(p=999;cheng[p]==0;p--){length2=p;}temp=count2-length2+1;for(k=1;k<=temp;k++){printf("0");}for(k=length2-1;k>=0;k--){printf("%d",cheng[k]);}printf("\n");}    }    else    {    if(yuan[j]=='1'){printf("1\n");}else if(yuan[j]=='5'){while(strcmp(yuan,"1")!=0){ chu(yuan,5); chen(cheng,2);count5++;}for(p=999;cheng[p]==0;p--){length1=p;}temp=count5-length1;for(k=1;k<=temp;k++){printf("0");}for(k=length1-1;k>=0;k--){printf("%d",cheng[k]);}printf("\n");}else{while(strcmp(yuan,"1")!=0){ chu(yuan,2); chen(cheng,5);count2++;}for(p=999;cheng[p]==0;p--){length2=p;}temp=count2-length2;for(k=1;k<=temp;k++){printf("0");}for(k=length2-1;k>=0;k--){printf("%d",cheng[k]);}printf("\n");}            }}}return 0;}</span>


0 0