马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 howzyao 于 2022-9-24 17:02 编辑
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
const int max_bit = 15;
void input_num(int);
void process_single(int*,int*,int);
void process_double(int*,int*,int);
int main()
{
cout << "Hello world!" << endl;
int x=0;
while(1)
{
cout<<"-----------------------------------begin"<<endl;
cout << "( x<=32767 ) 输入正数 x: ";
cin>>x;
input_num(x);//max 32767
}
return 0;
}
void input_num(int x)
{
int bits_value[ max_bit ];
int num_bit_save[max_bit];
for(int i=0;i<max_bit;i++)
{
num_bit_save[i]=0;
bits_value[i] = pow(2,i);
}
int max_num=0;
for(int i=0;i<max_bit;i++)
{
max_num += bits_value[i];
}
int tempx=0;
if(x<max_num+1)
{
tempx=x;
cout<<"输入的是: "<<tempx <<" (最大数: 32767)"<<endl;
}
else
{
cout<<"输入的是: "<<x<<" (最大数: 32767) 超过取值上限"<<endl;
}
int sum=0;
for(int i=0;i<max_bit;i++)
{
if(tempx==0)
{
break;
}
else if(tempx==bits_value[max_bit])
{
tempx -= bits_value[ max_bit ];
num_bit_save[max_bit-1]=1;
break;
}
else if(tempx >0 && tempx <bits_value[max_bit])// 处理1~32766
{
if(tempx%2==0)
{
for(int j=0;j<max_bit; j++)
{
process_double(bits_value,num_bit_save,tempx);
break; //跳出所有if 偶数 总是少1 未解决
}
}
else if(tempx%2==1)
{
for(int j=0;j<max_bit; j++)
{
process_single(bits_value,num_bit_save,tempx);
break; //跳出所有if 奇数 done by 20220924
}
}
}
break;//跳出for
}
int save=0;
cout<<"2进制数 == ";
for(int i=max_bit;i>-1;i--)
{
num_bit_save[max_bit]=0;
cout<<num_bit_save[i];
if(i%2==0)
cout<<" ";
}
cout<<"\n-----------------------------------end\n\n"<<endl;
delete bits_value,num_bit_save;
}
void process_double(int*bitsv,int*bsv,int n)
{
int t=n;
int i=max_bit;
int record_bit=0; //记录少1时,2进制数的最高位位数
int switchs=1;
while(t>-1) //2~32766 必然是偶数
{
if(t>bitsv[i] && switchs)
{
record_bit=i; //记录需要进1时,二进制所处的最高位 位置
switchs=0;
}
if(t>bitsv[i])
{
t -= bitsv[i]; //2~32766 必然是偶数
bsv[i]=1;
}
if( t<2 )
{
//bsv[0]=0; //2进制 第0位 设为0 因为 2~32766 必然是偶数
//bsv[0]=0;
t=-1; //结束处理
}
if( t==2 )
{
//t=-1;
//bsv[0]=0;
//bsv[1]=1;
//最高位进位怎么办
//最高位记录是record_bit
}
i--; //从15位到1位倒序遍历
}
//总是少一个
int choice=0;
for(int j=0;j<max_bit;j++)
{
if(bsv[j]==1)
choice += bitsv[j];
}
cout<<"偶数算少了1 x-1 == "<<choice<<" 最高位="<<record_bit+1
<<" ***偶数进位算法未解决*** "<<endl;
}
void process_single(int*bitsv,int*bsv,int n)
{
int t=n;
int i=max_bit;
while(t>0) // 1~32766 必然是奇数
{
if(t>bitsv[i]) //从最高位 开始 找
{
t -= bitsv[i]; //1~32766 必然是奇数 减去 当前位的值
//进入低1位的检查
bsv[i]=1; //设置2进制位
}
if(t==1) //到达 最低位 需要结束
{
bsv[0]=1; //2进制 最低位 设为1 因为 1~32766 必然是奇数
t=0; //结束处理
}
i--; //从15位到1位倒序遍历
}
}
|