顺序栈短除法c语言,进制转换

0

//千万不要重复定义同一个变量,由于习惯问题总喜欢在每个for里定义i或者j,

//然后这题搞了半天改了变量名就可以ac了,太难受了

#include #include

using namespace std;

string s;

int start[1000],num[1000],res[1000];//存放被除数的数组,存放商的数组,存放余数的数组

int main()

{

while(cin>>s)

{

int l=s.length();

for(int i=0;i

{

start[i]=s[i]-'0';

}

memset(res,0,sizeof(res));//先给res置0

int m=0;

while(l>=1)   //如果被除数还不为0,也就是长度还大于等于1就循环,每次会更新这个l

{

int k=0;

int x=0;

for(int j=0;j

{

x=10*x+start[j];

num[k++]= x/2;

x= x%2;

}

res[m++]=x;  //本轮最终的余数记录下来

int flag=0;

for(flag=0;flag

memset(start,0,sizeof(start));//将被除数清空,马上将商放进去作为被除数,开始下一轮

for(int n=flag,e=0;n

{

start[e]=num[n];

}

memset(num,0,sizeof(num));

l=l-flag;  //更新被除数的个数         }

for(int i=m-1;i>=0;i--)//逆序输出

{

cout<

}

cout<

}

}

发表于 2019-07-30 10:49:29

回复(1)

更多回答

23

#include

#include

using namespace std;

int main(){

char str[31];

int  num[31];

int res[2000];

while(scanf("%s",str)!=EOF){  //字符串转数字

for(int i=0;i

num[i]=str[i]-'0';

int size=strlen(str);

int index=0;//结果数组游标

for(int i=0;i

int temp=0,remain=0;//余数

for(int j=i;j

temp=(10*remain+num[j])%2;

num[j]=(10*remain+num[j])/2;

remain=temp;

}

res[index]=remain;

index++;

while(num[i]==0) //从第一个非0开始

i++;

}

for(int i=index-1;i>=0;i--) //逆序输出

{

printf("%d",res[i]);

}

printf("\n");

}

}

发表于 2019-02-26 12:17:48

回复(5)

10

import  java.util.*;

import java.math.BigInteger;

public class Main {

public static void main(String[] args) {

Scanner in=new Scanner(System.in);

while (in.hasNext()){

String str=in.nextLine();

BigInteger a=new BigInteger(str,10);

System.out.println(a.toString(2));

}

}

发表于 2018-04-07 14:18:49

回复(3)

5

#include

#include

#include

int main() {

char str[100];

int  ans[1000], get[100];

int  len, i, div, num, j = 0, temp = 0;

while (scanf("%s", str) != EOF) {

len = strlen(str);

for (i = 0; i

get[i] = str[i] - '0';

}

int index = 0;

while (index

for (i = 0; i

div = (get[i] + temp * 10) / 2;

num = (get[i] + temp * 10) % 2;

get[i] = div;

if (num != 0) {

temp = 1;

}

else { temp = 0; }

}

temp = 0;

if (0 == get[index]) {

index += 1;

}

ans[j] = num;

j++;

}

for (i = j - 1; i >= 0; i--) {

printf("%d", ans[i]);

}

printf("\n");

}

return0;

}

发表于 2018-03-08 19:12:29

回复(7)

4

就是大数除法,每次求得余数作为进制上位的数字。

#include

using namespace std;

int main(){

string S;

stack T;

for(int M,N,lm,i,j,c;cin>>M>>N>>S;cout<

lm = S.length();

vector V(lm,0);

for(i=0;i

for(i=0;i

for(j=i,c=0;j

V[j]+=c*M;

c=V[j]%N;

V[j]/=N;

}

T.push(c>9?'a'+c-10:'0'+c);

}

for(;T.top()=='0';T.pop());// trim back zero

for(;T.size();cout<

}

return 0;

}

发表于 2016-09-04 10:13:03

回复(0)

5

/* 这道题用python或者java很简单其实

* 但一般机试都是c/cpp哈,所以还是用了cpp

* 十进制到二进制这个就太简单了,涉及到的主要知识点就是大数除法

* 大数除法其实就是模拟我们小学学的除法

* 思路在下面注释里具体说明

*/

#include

#include

#include

#include

#include

using namespace std;

void trip0(string &s) {                             /* 去除字符串首的零 */

while (!s.empty() && s[0] == '0')

s.erase(s.begin());

}

string div_two(string s) {                          /* 大数除法 */

string ans;

int plus = 0;                                   /* 这个是前一个数除后的余数 */

for (int i = 0; i < s.length(); i++) {

int now = plus * 10 + (s[i] - '0');         /* 当前的被除数转化成整数要加上前面的余数*10 */

if (now >= 2) {                             /* 如果当前被除数>=2的话,会留下余数 */

ans.push_back(char(now / 2 + '0'));     /* 得到的商 */

plus = now % 2;                         /* 当前被除数除后的余数 */

} else {                                    /* 当前被除数小于2的话呢,商就是零,余数是本身 */

ans.push_back('0');

plus = now;

}

}

trip0(ans);                                     /* 去掉前导零,例如123/2,得到的是066 */

return ans;

}

int main() {

string temp;

while (cin >> temp) {

string ans;

trip0(temp);

while (!temp.empty() && temp != "0") {

int rail = (*(temp.end() - 1) - '0') % 2;

ans.push_back(char(rail + '0'));

temp = div_two(temp);

}

reverse(ans.begin(), ans.end());

if (!ans.empty()) cout << ans << endl;

else printf("0\n");

}

return 0;

}

发表于 2018-04-22 20:52:03

回复(1)

2

#include

#include

#include

bool iszero(char * num, int len)

{// 此函数用于判断输入的数是否为0

bool flag = true;

for(int i = 0; i < len; i++)

{

if(num[i] != 0)

{

flag = false;

break;

}

}

return flag;

}

int main(void)

{

//由于c语言中没有数据类型能存放30位数那么大的整数,所以这个借助字符数组来存放

//后来的30位大数的整除,求余操作要重新定义

//因为每次得到的余数属于一个数的末尾,所以要倒序打印得到的结果(借助栈)

char num[32];

while(scanf("%s", num) != EOF)

{

int len = strlen(num);

for(int i = 0; i < len; ++i)

{

num[i] = num[i] - '0';

}

int stack[1024]; int top = -1;// 栈顶初始化位-1,代表位空栈

while(!iszero(num, len))

{

int yushu = 0, shang = 0;//余数和商

for(int i = 0; i < len; i++)

{// 此循环为整个大数除2一次,并最后得到整体的余数

shang = (num[i] + yushu *10) / 2;

yushu = (num[i] + yushu *10) % 2;

num[i] = shang;

}

stack[++top] = yushu; //余数进栈

}

while(top != -1)

{

printf("%d", stack[top--]); //余数出栈

}

printf("\n");

}

}

发表于 2019-02-26 22:06:28

回复(0)

2

try:

while True:

print(bin(int(input())).replace('0b',''))

except Exception:

pass

编辑于 2018-10-09 10:28:39

回复(2)

3

python 解法 def baseN(num, b):

return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])

while True:

try:

a,b=map(int,input().split())

c=input()

val=int(c,a)

print(baseN(val,b))

except:

break

这道题一定要懂清楚题目意思,有点绕。。

要先把输入的M进制的数转为十进制,再根据要求转为N进制。

python的int函数可以方便的实现将任意进制的数转为十进制。将十进制转为N进制,由baseN函数实现。

这种解法代码量较少。

编辑于 2017-10-16 16:03:14

回复(0)

3

import java.util.Scanner;

import java.math.BigInteger;

public class Main {

public static void main(String[] args) {

change();

}

public static void change() {

Scanner in=new Scanner(System.in);

while (in.hasNext()) {

int M=in.nextInt();

int N=in.nextInt();

String val=in.next();

BigInteger big=new BigInteger(val, M);

String ss=big.toString(N).toLowerCase();

System.out.println(ss);

}

}

}

直接使用了BigInteger类型,因为BigInteger有这样的数据结构:

String val, int radix)

将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。

还有这样的toString方法:

再根据题目要求,把string变成小写就好了。

发表于 2016-08-27 18:01:46

回复(2)

1

#define _CRT_SECURE_NO_WARNINGS

#include 

#include 

#include 

using namespace std;

vector myVector;

string divide(string str, int n)//相当于实现n/2的操作,只要商。

{

int mode = 0;

for (int i = 0; i 

{

int current = mode * 10 + str[i] - '0';

str[i] = current / n + '0';

mode = current % n;

}

int pos = 0;

while (str[pos] == '0')

{

pos++;

}

return str.substr(pos);

}

int main()

{

string str;

while (cin >> str)

{

while (str.size())

{

int last = str[str.size() - 1] - '0';

myVector.push_back(last % 2);

str = divide(str, 2);

}

for (int i = myVector.size() - 1; i >= 0; i--)

{

printf("%d", myVector[i]);

}

cout <

myVector.clear();

}

return EXIT_SUCCESS;

}

发表于 2021-02-18 13:54:48

回复(0)

1

输入的数过长得用字符来处理,难点也就是需要用字符来模拟除法,用字符数组看着不顺眼,用string来处理,为了判断是否已经除尽,用一个start标识每轮的除法开始位置,看代码吧,注释比较详细

#include "bits/stdc++.h"

#include 

using namespace std;

int main(){

string input;

while(cin>>input){

int len = input.length();

stack result;

int start = 0;//用来判断本轮除法从哪一位开始,因为循环除法过程中高位会变为零,这时候就需要start++,用来防止高位0的重复计算

while(start

//来模拟除2

int res,remainder;//从高位开始除法,分别代表/2的结果和余数,余数参与下一位的除法计算。

remainder = 0;

for(int i=start; i

res = (remainder*10 + (int)(input[i] - '0'))/2;//当前位模拟除法

remainder = (remainder*10 + (int)(input[i] - '0'))%2;//当前位模拟取余

if(res == 0 && i == start)start++;//除得0,意味着原数变短一位(当且仅当,当前位是当前数首位)

input[i] = res+'0';

}

result.push(remainder);//本轮除法完毕,最终余数入栈

//            cout<

}

while (!result.empty()){//所有余数弹栈,结果就是答案

cout<

result.pop();

}

cout<

}

}

编辑于 2021-02-04 19:25:34

回复(0)

1

#include

using namespace std;

string Div(string a, int b, int& r)   //大整数除法 得余数

{

string c; r = 0;

for(int i = 0;i 

{

r = r*10+a[i]-'0';

if(r 

else

{

c += (r/b+'0'); r %= b;

}

}

while(c.length() > 1 && c[0] == '0') c.erase(c.begin());

return c;

}

string get2(string num)    //十进制转二进制

{

string ans = ""; int r = 0;

do       //do-while保证二进制0

{

num = Div(num, 2, r);

ans = (char)(r+'0') + ans;

}while(num != "0");

return ans;

}

int main()

{

ios::sync_with_stdio(false);

string num;

while(cin >> num)

{

cout <

}

return 0;

} 用时4ms,请教可以时间优化的地方😐。

编辑于 2021-01-17 22:00:20

回复(0)

1

print(bin(int(input())).replace('0b', ''))

发表于 2020-10-26 14:34:19

回复(0)

1

利用短除法,一直除至0,输出的数通过栈反序输出。

通过字符数组接受数据,转换成int存入队列q1中,将队列中的数据一次取出对2取余,整除,存入第二个队列q2,直到第一个队列为空,将去q1=q2;循环,直到q1为空

#include

#include

#include

#include

using namespace std;

int main(){

char ch[35];

while(cin>>ch){

queue q1;

stack s1;

for(int i=0;i

int temp=ch[i]-'0';

q1.push(temp);//存入队列

}

while(!q1.empty()){//结束条件,队列为空

int cf=0;//进位;

queue q2;//临时队列,存中间数据

while(!q1.empty()){

int temp=q1.front();

// cout<

q1.pop();

int sum=cf*10+temp;

if(sum%2==1){

cf=1;

}else{

cf=0;

}

int next=sum/2;

//判断第一个数为0的情况

if(next==0){

if(!q2.empty()){

q2.push(next);

}

}else{

q2.push(next);

}

}

q1=q2;

s1.push(cf);//结果放入栈中

}

while(!s1.empty()){//输出

cout<

s1.pop();

}

cout<

}

return 0;

}

发表于 2020-08-08 10:45:24

回复(0)

1

#include//进制转换,其余进制再写个数组存字母输出即可

#include

int zhuan(int a[],int b[],int n,int from,int to)//进制转换函数

{

int size=0,i,j,t;

for(i=0;i

{

int k=0;

for(j=i;j

{

t=(a[j]+k*from)%to;

a[j]=(a[j]+k*from)/to;

k=t;//整个循环结束得到第一个二进制数

}

b[size++]=k;//一个二进制数

while(a[i]==0) i++;//从非零的数开始做除法

}

return size;

}

int main()

{

char sa[31];

int a[31],b[1000],i,j;

while(gets(sa)!=NULL)

{

for(i=0;sa[i]!='\0';i++)

a[i]=sa[i]-'0';//字符数组转换成整数数组

int size=zhuan(a,b,strlen(sa),10,2);

for(i=size-1;i>=0;i--)//进制转换倒序输出

printf("%d",b[i]);

printf("\n");

}

}

编辑于 2020-04-26 15:40:50

回复(0)

1

Java 解法

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

while (scanner.hasNext()) System.out.println( scanner.nextBigInteger().toString(2));

}

}

发表于 2020-03-18 10:20:23

回复(0)

1

做了前面那个十进制转二进制反序再转十进制的题,瞬间觉得这题难度不大有没有,但是还是出了点错误,反序输出,循环条件习惯性地写成了i++,应该是i--😂😂😂 #include "stdio.h"

#include "string.h"

int main(){

char dec[31],bin[120];

int i,j,len,carry,k = 0;

while(~scanf("%s",dec)){

//dec数组存储每一位数字,其中低下标存高位

//说得高级一点就是小端存储,嘻嘻嘻

len = strlen(dec);

k = 0;

//一层循环,通过不断除以2使最高位变成0,循环变量才+1

for(i = 0; i < len; ){

carry = 0;

for(j = i; j < len; j++){

//j是当前位

//首先根据传递的进位更新本位的数值

//除以2得到的数值结果存在本位

//余数的数值存在carry

dec[j] = dec[j] - '0' + carry*10;

carry = (dec[j]) % 2;

dec[j] = dec[j] / 2 + '0';

}

//bin数组存储高下标存储高位的二进制结果

bin[k++] = carry +'0';

while(dec[i] == '0') i++;

}

bin[k] = '\0';

for(i = k-1;i>=0;i--)

printf("%c",bin[i]);

printf("\n");

}

return 0;

}

发表于 2019-06-24 15:38:44

回复(0)

1

#include

void convert(int x,int y,char a[4001],char b[4001]){//任意x进制大整数a[i]转换为y进制大整数b[j]

int j;

for(j=0;strlen(a)!=0;j++){

int yu=0,mark=0,temp,offset=0;//yu为临时余数,mark=0说明忽略除数中为零的最高位,offset为除数数组下标

for(int i=0;i

if(a[i]>='0'&&a[i]<='9')

temp=a[i]-'0'+yu*x;//判断是否十进制以内数

else if(a[i]>='A'&& a[i]<='Z')

temp=a[i]-'A'+10+yu*x;//判断是否超过十进制

if(temp/y!=0) mark=1;

if(mark==1)

if(temp/y<10) a[offset++]=temp/y+'0';

else a[offset++]=temp/y-10+'A';//恢复对应的字符值

yu=temp%y;

}

if(yu<10) b[j]=yu+'0';

else b[j]=yu-10+'A';//确保十进制以上的数正确存储

a[offset]='\0';

}

b[j]='\0';

}//转换结果倒序存放

int main(){

char a[4001],b[4001];

while(gets(a)){

convert(10,2,a,b);

for(int i=strlen(b)-1;i>=0;i--)

printf("%c",b[i]);//结果倒序输出

printf("\n");

memset(a,0,sizeof(a));

memset(b,0,sizeof(b));

}

}

编辑于 2019-03-16 15:48:03

回复(0)

1

#include

#include

#include

using namespace std;

int main()

{

string s;

int o[30];

int olen;

int res[30];

int rlen;

int r;

vector br;

while(cin>>s)

{

br.clear();

olen = rlen = r = 0;

for(int i=0; i

{

o[olen++] = s[i]-'0';

}

while(1)

{

for(int i=0; i

{

r = r*10 + o[i];

if(r<2)

res[rlen++] = 0;

else

{

res[rlen++] = r/2;

r = r%2;

}

}

while(res[0] == 0 && rlen > 1)

{

for(int i=0; i

res[i] = res[i+1];

rlen--;

}

br.push_back(r);

if(res[0] == 0)

break;

for(int i=0; i

{

o[i] = res[i];

}

olen = rlen;

rlen = r = 0;

}

if(br[br.size()-1] == 0)

br.pop_back();

for(int i=br.size()-1; i>=0; i--)

cout<

cout<

}

}

发表于 2018-04-12 18:46:41

回复(0)

1

#include void main() { unsigned n; int a[30],i=0; printf("please input a number less 30 characters:"); scanf("%d",&n); while(n>1){ a[i++]=n%2; n=n/2; } if(n==1) a[i]=1; else i--; while(i>=0) printf("%d",a[i--]); }

发表于 2018-03-24 11:36:23

回复(0)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值