|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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位倒序遍历
- }
- }
复制代码 |
|