c语言中字符串“1001”怎么转换成2进制数列1001

 我来答
阳光小胡同
2011-02-25 · TA获得超过495个赞
知道答主
回答量:395
采纳率:0%
帮助的人:0
展开全部
给你吧
这个题很明显不能直接乘,因为没有那个类型能到达如此之精度,因为有好多次方吗,于是我把每次相乘的结果结果保存在int r[151]数组里面,数组中每个元素保存结果中的一位,如例子中最后一组1.01 的12次方的结果为1.126825030131969720661201,那么最后,r中元素为:r[1]=1、r[2]=1、r[3]=2、r[4]=6........

计算时乘数忽略了小数点和无效0,如1.0100计算时使用101,而r初始值为乘数即,r[1]=1,r[2]=0、r[3]=1;然后与乘数101相乘12-1=11次,每次相乘都是r中每个元素与乘数相乘,相乘后r中每个元素不在是保存一位数,于是需要进位,使r中元素仍只有一位数。这样计算的话,r数组中每个元素都不会超出精度,因为每次相乘都是一位数和乘数相乘。由于忽略了小数点,所以计算前需要确定是否有小数点,如果有的话小数点后有几位有效数字也要确定,然后就可以得出计算完成后小数点后有几位有效数字,输出就能将小数点加进去了。
这就是大概过程 代码如下:

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

int main()
{
string mlp; //乘数
int power; //乘数的幂
int r[151]; //保存结果
int hdot;
while(cin>>mlp>>power)
{
hdot=0;
for(int t=0;t<150;t++)
{
r[t]=-1;
}
if(mlp.find(".")!=string::npos)
hdot=mlp.length()-mlp.find(".")-1;
string::iterator itr=mlp.end()-1;
while(hdot>0&&itr>=mlp.begin())
{
if(*itr!='0')

hdot--;
itr--;
}
int cn=0;
while(itr>=mlp.begin())
{
if(*itr!='.')
{
r[cn]=*itr-'0';
cn++;
}
itr--;
}
int k=cn-1;
int m=0; //保存临时数;
while(k>-1)
{
m=m*10+r[k];
k--;
}
for(int i=1;i<power;i++)
{
int j=0;
while(r[j]>-1)
{
r[j]=r[j]*m;
j++;
}
j=0;
while(r[j]>-1)
{
if(r[j+1]==-1&&r[j]>=10)
r[j+1]=r[j]/10;
else
r[j+1]+=r[j]/10;
r[j]=r[j]%10;
j++;
}
}
hdot=hdot*power;
int cnt=0;
while(r[cnt]>-1)
{
cnt++;
}
if(hdot>=cnt)
{
cout<<".";
while(hdot>cnt)
{
cout<<"0";
hdot--;
}
hdot=0;
}
for(k=cnt-1;k>=0;k--)
{
if((k+1)==hdot&&hdot!=0)
cout<<".";
cout<<r[k];
}
cout<<endl;
}
return 0;
}
2706002002
2011-02-25
知道答主
回答量:12
采纳率:0%
帮助的人:4.6万
展开全部
可以这么做:(部分代码)
#include<stdio.h>
#include<stdlib.h>
const int MAX=100;
void main(){
char str[MAX]="1001";
long int result=0;
int i=j=0;
for(i=0;i<str.length();i++){
int k=str[i]-'0'; //把字符装换成数字
if(k==0) continue; // k只可能为0 或者1,为0则继续
for(j=0;j<str.length()-i-1;j++){
result+=k*10; //为1 则转换成相应的整数
}
}
println("%ld",result); //result为最终的数列结果
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ATF144X
2011-02-25 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5344
采纳率:77%
帮助的人:4671万
展开全部
char a[4]="1001";
int c;
c=(a[0]-0x30)*8+(a[1]-0x30)*4+(a[2]-0x30)*2+a[3]-0x30;

结果在c中的数值是9,即二进制00001001。

或者用循环的方法:
char a[4]="1001";
int c,i;

for(i=0;i<4;i++)
{
c+=(a[i]-0x30)*(2^(3-i));
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jinweifeng06
2011-02-25 · 超过17用户采纳过TA的回答
知道答主
回答量:86
采纳率:0%
帮助的人:56.2万
展开全部
从右获得单个的字符,然后定义一个int n = 2(0次方)*a[0] + 2(1)*a[1] + ...
n就是2进制数的大小,转换为2进制就是1001
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式