c++两个自然数(输入的十进制数转换为二进制时,两个数的位数相同。) 输出:有效则有效,无效则无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++两个自然数(输入的十进制数转换为二进制时,两个数的位数相同。) 输出:有效则有效,无效则无效相关的知识,希望对你有一定的参考价值。

取两个自然数(十进制)并检查信息是否有效。系统将自然数(十进制)转换为二进制数,检查每一位是否相等或不同。 例如,如果两个自然数是 10 和 12,则 10 是二进制 1010,12 是 1100。由于 1010 和 1100 的第一和第四位相同,因此无效。
再举一个例子,如果两个自然数是 10 和 5,则 10 是二进制的 1010,而 5 是二进制的 0101。这是有效的,因为 1010 和 0101 中的所有位都不相等。
输入:两个自然数(输入的数转换为二进制时,两个数的位数相同。) 输出:有效则有效,无效则无效
例: 10 12
输出:无效

10 5
有效

c++两个自然数判断二进制位是否相同:先说一下算法,首先可以把其中一个数按位取反,再和另一个数按位与。如果结果等于第二个数则表示有效,否则无效。
#include<iostream>
using namespace std;
int main()
int a, b;
cin >> a>>b;
if(b==(~a & b))
cout<<"有效"<<endl;
else
cout<<"无效"<<endl;
return 0;
追问

是输入十进制的数,程序把这两个十进制的数转换成二进制的数,然后比对这两个二进制的每一位数,有相同的位置的数一样,无效,没有相同的话,则有效

追答

这个就是输入十进制数,数在内存中就是二进制,还转换啥?

追问

不太准确啊

追答

我写错了,是b==(~a & b)

参考技术A 可以写一个统计一个数的二进制位数的函数。统计出两个自然数中大数的二进制位数为k位,在判断两数之和是否等于2的k次方减1,如果相等,则输出有效,不相等则输出无效。

C++ 十进制数转换成任意进制数

#include<iostream>
using namespace std;
const int StackSize=1024;
class Seqstack
public:
Seqstack()top=-1;//构造函数,初始化空栈
void Push(int x);//入栈
int Pop();//出栈
bool Empty();//判别栈是否为空
void Trans(int Num,int N);//函数功能:将十进制的数Num转换为N进制

private:
int data[StackSize];//定义数组
int top;//栈顶指针
;
void Seqstack::Push(int x)
if(top>=StackSize-1)throw"上溢";
top++;
data[top]=x;
int Seqstack::Pop()
if(Empty())throw"下溢";
top--;
return data[top+1];
bool Seqstack::Empty()
if(top==-1)return 1;
else return 0;
void Seqstack::Trans(int Num, int N)
int k;
while(Num)
k=Num%N;
Push(k);
Num=Num/N;
while(!Empty())
k=Pop();
if(k<10)cout<<k;
else cout<<char(k+55);

void main()
int Num,N;
Seqstack s;
cout<<"将十进制数Num转换成N进制输出,请输入Num,N"<<endl;
cin>>Num>>N;
while(Num)
s.Trans(Num,N);

不知道哪里条件设置出现问题了,菜鸟求大神指点= =

while(Num)
s.Trans(Num,N);
主函数里面这句
为什么要用while呢?
Num数值并没有传回,也就是Num没变,这个死循环了
如果想Trans里面的值传回 用int &Num做参数
void Trans(int &Num,int N);//函数功能:将十进制的数Num转换为N进制
不过觉得没比要的
退出这个函数的时候,Num肯定是0了,传回来没意义
你把这个while去掉 直接调
s.Trans(Num,N);
应该就ok了追问

我去掉了while,直接调用也还是死循环,是不是Trans这个函数有问题?

追答

怎么会呢 

我这边测试是好的

我的完整程序 

你看下和你的有什么区别

我印象中只改了IDE相关头文件和注释while

#include<iostream>
using namespace std;
const int StackSize=1024;
class Seqstack
public:
       Seqstack()top=-1;//构造函数,初始化空栈
  void Push(int x);//入栈
  int Pop();//出栈
  bool Empty();//判别栈是否为空
  void Trans(int Num,int N);//函数功能:将十进制的数Num转换为N进制
  
 private:
  int data[StackSize];//定义数组
  int top;//栈顶指针
;
void Seqstack::Push(int x)
if(top>=StackSize-1)throw"上溢";
 top++;
 data[top]=x;
int Seqstack::Pop()
if(Empty())throw"下溢";
 top--;
 return data[top+1];
bool Seqstack::Empty()
if(top==-1)return 1;
 else return 0;
void Seqstack::Trans(int Num, int N)
int k;
 while(Num)
 k=Num%N;
  Push(k);
  Num=Num/N;
 while(!Empty())
 k=Pop();
  if(k<10)cout<<k;
  else cout<<char(k+55);

int main()
int Num,N;
 Seqstack s;
 cout<<"将十进制数Num转换成N进制输出,请输入Num,N"<<endl;
 cin>>Num>>N;
// while(Num)
  s.Trans(Num,N);

运行结果

$g++ bd.c -o 1 -Wall

$./1

将十进制数Num转换成N进制输出,请输入Num,N

100 2

1100100

$./1

将十进制数Num转换成N进制输出,请输入Num,N

100 16

64

$./1

将十进制数Num转换成N进制输出,请输入Num,N

100 8

144

追问

我的版本是VS2005,代码完全一样的,输出的数值是对的,但是就是无限循环的重复输出,没有终止

追答

还有这样的事情 你确定编译运行的是修改后的文件吗?

几个方式你可以试一下

    在原来代码基础上 Trans 结尾加一个打印信息,看是否退出了Trans

    在这个打印后 加一个exit(0)或者while(1) 强制程序停在这里

如果还没效果 依旧死循环 那么只能猜是环境问题了

不过 强烈怀疑你没有执行修改后的代码,而是一直运行的之前的

参考技术A 你的代码,真的太复杂了

你看看我的,多组数据,十进制n转换r进制

#include<stdio.h>
int main()

int n,r,a[1000],t,f;
while(scanf("%d%d",&n,&r)==2)

t=-1;f=0;
if(n==0)printf("0\n");
else

if(n<0)f=1,n=-1*n;
while(n!=0)a[++t]=n%r;n/=r;
if(f==1)printf("-");
while(t>=0)
if(a[t]>=10)printf("%c",a[t]-10+'A');
else printf("%d",a[t]);t--;

printf("\n");




短吧,望采纳
参考技术B 觉得你写复杂了,提供一个作参考……
//#include "stdafx.h"//vc++6.0加上这一行.
#include "string.h"
#include "iomanip.h"
void Itob(int n,char s[],int b)
char cx,i;
for(i=0;;i++)
cx=n%b;
s[i]=cx+(cx>=0 && cx<=9 ? '0' : 0x37);
n/=b;
if(n==0 && cx==0) break;

s[i]=NULL;
strcat(s,b==2 ? ")B(" : b==8 ? "O" : b==16 ? "x0" : "");
strrev(s);

void main(void)
char p[20];
int n,b;
cout << "请输入一个十进制整数...\nn=";
cin >> n;
cout << "请输入要转换成的进制数(2~16)...\nb=";
cin >> b;
Itob(n,p,b);
cout << "输入的十进制数是 " << n << ".\n" << "转换成 " << b << " 进制是 " << p << ".\n";
参考技术C 兄弟,你这个程序不太现实啊,你要是想用个1000进制数输出,你上哪找那么多字母表示1000进制的一个位上的数?追问

主要用来测试2,8,16的,不要在意那些细节= =

追答//不知道第一次提交为什么没成功。。。。。。。
#include <stdio.h>
void print(int n)

if(n>-1&&n<10)

printf("%c",'0'+n);

else if(n<36)

printf("%c",'a'+n-10);


void trans(int n,int k)//你是要转换的数,k是进制

if(n>0)

trans(n/k,k);
print(n%k);

void main()

    trans(355,16);


以上是关于c++两个自然数(输入的十进制数转换为二进制时,两个数的位数相同。) 输出:有效则有效,无效则无效的主要内容,如果未能解决你的问题,请参考以下文章

C语言 字符串转数字 急急急

BCD码和二进制码有啥区别

(C++)除基取余法:将十进制数转化为Q进制数

c++函数编程实现自然数的十进制、二进制、八进制、十六进制转换

C++ 十进制数转换成任意进制数

C++ 编写程序,输入两个数,输出两个数之间的所有数的二进制,三进制,和八进制?