题目刚开始没读懂,后来懂了,就是求出第一个满足前几位等于输入的2的E次方的E为多少。有点拗口。并且题目还有一个要求就是 the number of legible digits is strictly smaller than the number of lost ones 清晰可变的数字个数小于已经丢失的数字个数。
因为给出的数据范围有点大,所以我用高精度的大数乘小数做的。

 

#include <stdio.h>
#include <string.h>
 
void mult(char c[],char t[],int m);
 
int main()
{
int i;
int sum, t;
int flag = 0;
char a[20], b[20];
char s[20];
 
while( scanf("%s", b) != EOF )
{
getchar();
memset(a, 0, sizeof(a));
memset(s, 0, sizeof(s));
 
a[0] = '1';
flag = 0;
sum = 1;
 
while(1)
{
mult(a, s, 2);
for( i = 0; b[i] != 0; i++ )
{
if( s[i] != b[i] )
{
flag = 1;
}
}
t = strlen(s)-strlen(b); //t表示丢失数
if( flag == 0 && t > strlen(b) )
{
break;
}
else
{
strcpy(a, s); //不是吧s赋值给a,继续相乘
flag = 0;
sum++;
}
}
 
printf("%d\n", sum);
memset(b, 0, sizeof(b));
 
}
 
 
return 0;
}
 
void mult(char c[],char t[],int m) //c[]乘数,t[]结果, m小数
{
int i,l,k,flag,add=0;
char s[100];
l=strlen(c);
for (i=0;i<l;i++)
s[l-i-1]=c[i]-'0';
for (i=0;i<l;i++)
{
k=s[i]*m+add;
if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else
{s[i]=k;flag=0;add=0;}
}
if (flag) {l=i+1;s[i]=add;} else l=i;
for (i=0;i<l;i++)
t[l-1-i]=s[i]+'0';
t[l]='\0';
}
 

发表评论

电子邮件地址不会被公开。

Post Navigation