10. 倒数问题
一个正整数的倒数是1除以那个整数。举例来说,37 的倒数是 1/37。有些正整数的倒数是可以用十进制的有限不循环小数表示的,这些正整数包括:
- 10 的幂;
- 2 的幂;
- 2 的幂并跟着数个 0;
- 5 的幂;
- 5 的幂并跟着数个 0。
你的任务是求出这样一些整数的倒数,并用十进制表示出来。
输入
输入的第一行是要处理的正整数的个数,后面每一行输入一个正整数。每一个正整数都符合以下条件:
- 都会从行首开始,
- 其第一列的数字不为 0,
- 最多包含 72 个数字。
输出
对于每一个正整数,输出以精确的十进制表示的该数的倒数。每个结果一行。
测试用例 1 以文本方式显示
1.4↵
2.4↵
3.100↵
4.6250000↵
5.10485760↵
以文本方式显示
1.0.25↵
2.0.01↵
3.0.00000016↵
4.0.000000095367431640625↵
1秒 64M 0
分析:先去掉数字后面的零。然后看处理后的数字最后一位是5还是2的倍数,然后原数除以5或者2,ans乘上2或者5,知道原数变成1,再输出相应位数的0.即可。
#include<stdio.h>
#include<string.h>
#define MAX 301
/*
•10 的幂;
•2 的幂;
•2 的幂并跟着数个 0;
•5 的幂;
•5 的幂并跟着数个 0。
*/
void times(char *a,int x)//倒序
{
int tt = 0,jin = 0,i;
for (i = 0; i < strlen(a); i++)
{
int ind = a[i] - '0';
tt = ind*x + jin;
jin = 0;
if(tt >= 10)
{
a[i] = tt % 10 + '0';
jin = tt/10;
}else if(tt>0&&tt<10){
a[i] = tt + '0';
}else continue;
}
if(jin){a[i] = jin+'0'; a[i+1] = '\0';}
else a[i] = '\0';
}
void divide(char *a,int x)//简单除法
{
int t = 0;
for (int i = 0; i < strlen(a); i++)
{
int ind = a[i] - '0';
ind += 10*t;
t = ind/x;
a[i] = t + '0';
t = ind%x;
}
}
int main()
{
char b[75];
int n,len,i,tmp,j;
scanf("%d\n",&n);
while(n--)
{
char ans[MAX] = {'1','\0'};
ans[MAX-1] = '\0',ans[MAX-2] = '1';
gets(b);
len = strlen(b);
int ling = 0;
for (i = len-1; i >= 0; i--)
{
if(b[i] == '0')ling++;
else break;
}b[i+1] = '\0';
int flag = 0;
tmp = strlen(b)-1;
while (!flag){
if(b[tmp] == '1')
{
if(ling){
printf("0.");
for (int i = 1; i < ling; i++)printf("0");
printf("1\n");
}
else printf("1\n");
flag = 1; break;
}else if((b[tmp]-'0')%2 == 0){
divide(b,2); times(ans,5);
}else if((b[tmp]-'0')%5 == 0){
divide(b,5); times(ans,2);
}
if(b[strlen(b)-1] == '1')break;
}
ling += tmp+1;
if(!flag)
{
printf("0.");
for(i = 1; i < ling; i++)printf("0");
for(i = strlen(ans)-1;i>=0;i--)printf("%c",ans[i]);
printf("\n");
}
}
return 0;
}