算法Java如何实现把不定长的字符串扩展为128位二进制数?
发布网友
发布时间:2024-04-28 22:43
我来回答
共1个回答
热心网友
时间:2024-06-18 22:53
如果这个二进制数比较大的话, 大到只能用数组储存这个二进制数,
当然如果大到转化成10进制int存不下的情况那另当别论
#include<stdio.h>
#include<string.h>
int main()
{
char a[33];
int i, num = 0;
scanf("%s", a);
for(i=strlen(a)-1; i>=0; i--)
{
num*=2;
num+=a[i]-'0';
}
printf("%d\n", num);
return 0;
}
不好意思,没看清楚题目,大数的我也没编出来。
我在网上找到了一个C++的,希望对你有帮助。
//==========================================
//将64个3000位的二进制转化成十进制,性能:120秒内
//------------------------------------------
#include<iostream>
#include<fstream>
#include<sstream>
#include<algorithm>
#include<time.h>
using namespace std;
//------------------------------------------
int main(){
clock_t start=clock(); //统计时间
ifstream in("abc.txt");
for(string s;getline(in,s);){ //读取二进制数
int b[904]={0},t=0; //三千位的二进制数都为1时最大,转换后约为1.2e+903,所以取数组904足够
int a[904]={0}; //数组的每一位放置十进制的一位数,从a[0]到a[903]依次为个位、十位、百位...
a[0]=1; //数组初值全为零,第一位为2的0次方,等于1,所以a[0]附值为1
reverse(s.begin(),s.end()); //倒置字符串s
for(int k=0;k<s.size();k++){ //开始从k=0位读取字符s[k]
if(s[k]=='1'){ //等于'0'时,2的k次方为0
for(int i=t;i<k;i++){ //求2的k次方,每次循环乘2,共乘k-t次 t为保留的上次a[i]累计
for(int j=0;j<904;j++) //每一位都乘2
a[j]=2*a[j];
t=k;
for(j=0;j<904;j++) //检查从a[0]到a[903]每位是不是都是个位数
if(a[j]>=10){ //超过10就要进位
a[j]=a[j]-10; //j位大于10进1
a[j+1]=a[j+1]+1; //下位即j+1位要加1
}
}
for(int j=0;j<904;j++){ //b数组为求和数组,初值为0
b[j]=b[j]+a[j]; //将此次k位上的2的k次方数的大小与b求和
if(b[j]>=10){ b[j]=b[j]-10; b[j+1]=b[j+1]+1;}//大于10进1,下一位加1
}
}
}
int w;
for(int i=903;i>=0;i--) //w为统计此3000位二进制数转化为十进制后的位数
if(b[i]!=0){ w=i;break;} //从最高位开始,遇到非0数结束
for(i=w;i>=0;i--) //输出结果,注意是从高位开始输出
cout<<b[i];
cout<<endl;
cout<<"十进制位数为:"<<w+1<<endl<<endl; //输出转化后的十进制数位数
}
cout<<"耗用时间为:"<<(clock()-start)/CLK_TCK<<endl; //输出耗用时间,64个3000位的测试时间为12秒
}//=======================================
还有一个这个。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 10000
typedef struct{
int len;
char value[MAX_LEN];
} TBigInt, *pBigInt;
void AddBit(pBigInt s,char BitValue){ //加一位, 0或者1。
int i;
for (i=0;i<s->len;i++)
s->value[i]*=2;
s->value[0]+=BitValue;
for (i=0;i<s->len;i++){
s->value[i+1]+=s->value[i]/10;
s->value[i]%=10;
}
if (s->value[s->len]) s->len++;
}
void OutputBigInt(pBigInt s){ //输出大整数类型
int i;
if (s->len==0){
puts("0");
} else {
for (i=s->len-1;i>=0;i--)
putchar(s->value[i]+'0');
putchar('\n');
}
}
int main(){
static char buf[1000000];
static TBigInt BigInt;
while (scanf("%s",buf)!=EOF){
memset(&BigInt,0,sizeof BigInt);
int i;
for (i=0;buf[i];i++)
AddBit(&BigInt,buf[i]=='1'?1:0);
OutputBigInt(&BigInt);
}
return 0;
}