#include<stdio.h>
#include<string.h>
//返回s1*num 0<=num<=10
char* mul(char *s1,int num)
{
if(num==1) return s1;
else if(num==0 || strcmp(s1,"0")==0) return "0";
else if(num==10) return strcat(s1,"0");
int len1=strlen(s1);
char str[1000];//可以计算10000位以内的数
int temp=0;//表示要进位的数,如9*9=81 则temp存储的是8
int j=0;
for(int i=len1-1;i>=0;i--)
{
int t=(s1[i]-'0')*num+temp;
str[j++]=t%10+'0';
temp=t/10;
}
if(temp)
str[j++]=temp+'0';
str[j]=0;//形成串
strrev(str);
return str;
}
void add1(char *s)
{
char *p=s;
if(*s)
{
while(p[1])
p++;
}
//此时的p指向最后一个数,如s="12345",那么p指向5的位置
while(s<=p)
{
if(*p<'9')
{
*p=*p+1;
return;
}
else
{
*p='0';
p--;
}
}
*s='1';
strcat(s,"0");
}
char* _2to10(char *str_2,char *str_10)
{
char *bin = str_2;
while(*bin)
{
strcpy(str_10,mul(str_10,2));
if(*str_2=='1')
add1(str_10);
bin++;
}
return str_10;
}
void main()
{
char *str_2="11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
//char str_2[200]="11111111111111111111111111111111";
printf("二进制:\n%s\n其长度:%d\n\n",str_2,strlen(str_2));
char str_10[1000]="0";
_2to10(str_2,str_10);
printf("其十进制数是:\n");
puts(str_10);
}