user-0 提问: 算法题求助

回复:
user: user-0
content: 👌大佬，过会我试一下

user: user-1
content: #include <stack> #include <iostream> using namespace std;  void convert(int number, int div){  	stack<int> s_num; 	while(number){ 		s_num.push(number%div); 		number /= div; 	} 	while(!s_num.empty()){ 		cout << s_num.top(); 		s_num.pop(); 	} }   int main(int argc, char **argv){ 	 	int number, div; 	cin >> number; 	cin >> div; 	cout << "number == " << number << " == "; 	convert(number, div); 	return 0; }   利用数据结构中栈来实现的C++代码，拿走不谢

user: user-1
content: 博主学过数据结构吗，学过数据结构后，这类进制转化的问题可以直接用栈的方法解决

user: user-0
content: 引用 27 楼 Donald_Shallwing 的回复:博主学过数据结构吗，学过数据结构后，这类进制转化的问题可以直接用栈的方法解决目前正在学，学过书上的例子，但没有真正用来解过题，

user: user-0
content: 引用 24 楼 悲伤的小霉的回复:[quote=引用 22 楼 bsnow的回复:][quote=引用 19 楼 悲伤的小霉 的回复：]可以，就是模拟进位运算，和十进制一样。我看了一下这道题虽然不难，但是也很有意思。后来发现一篇文章https://leetcode.com/articles/add-binary/  我采用得是第一个算法的思想，第二个更精妙[/quote] #include<stdio.h> #include<string.h> const int N=1010; char a[N],b[N]; int aa[N],bb[N],ans[N]; int main() {     while(~scanf("%s%s",a,b))     {         int lena=strlen(a);         int lenb=strlen(b);         int len=lena>lenb?lena:lenb;         for(int i=lena-1;i>=0;i--)aa[len--]=a[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         for(int i=lenb-1;i>=0;i--) bb[len--]=b[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         int pre=0;         for(int j=len;j>=0;j--)       //开始相加         {             ans[j]=(aa[j]+bb[j]+pre)%2;             pre=(aa[j]+bb[j]+pre)/2;         }         int pos=-1;         for(int i=0;i<=len;i++)    //找到第一个非0         {             if(ans[i])             {                 pos=i;                 break;             }         }         if(pos==-1) printf("0\n");//遍历完数组，没有发现非0数，那么输出0         else         {             for(int i=pos;i<=len;i++)//从第一个非0处输出                 printf("%d",ans[i]);             printf("\n");         }     }     re这个是c++的[/quote] #include<stdio.h> #include<string.h> const int N=1010; char a[N],b[N]; int aa[N],bb[N],ans[N]; int main() {     while(~scanf("%s%s",a,b))     {         int lena=strlen(a);         int lenb=strlen(b);         int len=lena>lenb?lena:lenb;         for(int i=lena-1;i>=0;i--)aa[len--]=a[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         for(int i=lenb-1;i>=0;i--) bb[len--]=b[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         int pre=0;         for(int j=len;j>=0;j--)       //开始相加         {             ans[j]=(aa[j]+bb[j]+pre)%2;             pre=(aa[j]+bb[j]+pre)/2;         }         int pos=-1;         for(int i=0;i<=len;i++)    //找到第一个非0         {             if(ans[i])             {                 pos=i;                 break;             }         }         if(pos==-1) printf("0\n");//遍历完数组，没有发现非0数，那么输出0         else         {             for(int i=pos;i<=len;i++)//从第一个非0处输出                 printf("%d",ans[i]);             printf("\n");         }     }     return 0; }

user: user-0
content: 引用 22 楼 bsnow的回复:[quote=引用 19 楼 悲伤的小霉 的回复：]可以，就是模拟进位运算，和十进制一样。我看了一下这道题虽然不难，但是也很有意思。后来发现一篇文章https://leetcode.com/articles/add-binary/  我采用得是第一个算法的思想，第二个更精妙[/quote] #include<stdio.h> #include<string.h> const int N=1010; char a[N],b[N]; int aa[N],bb[N],ans[N]; int main() {     while(~scanf("%s%s",a,b))     {         int lena=strlen(a);         int lenb=strlen(b);         int len=lena>lenb?lena:lenb;         for(int i=lena-1;i>=0;i--)aa[len--]=a[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         for(int i=lenb-1;i>=0;i--) bb[len--]=b[i]-'0';//将字符数组转化为整型，右对齐         len=lena>lenb?lena:lenb;         int pre=0;         for(int j=len;j>=0;j--)       //开始相加         {             ans[j]=(aa[j]+bb[j]+pre)%2;             pre=(aa[j]+bb[j]+pre)/2;         }         int pos=-1;         for(int i=0;i<=len;i++)    //找到第一个非0         {             if(ans[i])             {                 pos=i;                 break;             }         }         if(pos==-1) printf("0\n");//遍历完数组，没有发现非0数，那么输出0         else         {             for(int i=pos;i<=len;i++)//从第一个非0处输出                 printf("%d",ans[i]);             printf("\n");         }     }     re这个是c++的

user: user-2
content: 引用 4 楼 悲伤的小霉 的回复：可以了,谢谢大佬可是提交答案还是不能通过，提示  Runtime Error！！超时了，算法精简下

user: user-3
content: 引用 19 楼 悲伤的小霉 的回复：可以，就是模拟进位运算，和十进制一样。我看了一下这道题虽然不难，但是也很有意思。后来发现一篇文章https://leetcode.com/articles/add-binary/  我采用得是第一个算法的思想，第二个更精妙

user: user-4
content: 可以用字符串，这样写更简单

user: user-0
content: 可以，就是模拟进位运算，和十进制一样。

user: user-5
content: 弱弱的问一句，用二进制直接进行加法操作不可以吗？

user: user-6
content: 看看看不错的

user: user-7
content: 直接二进制运算也可以，但是需要unsigned int [32]或者unsgined long long [16]数组，要自己处理移位和进位

user: user-0
content: 感谢大佬！！！！！

user: user-3
content: #include <stdio.h> #include <string.h> #include <stdlib.h>  #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) #define MAX(X, Y) (((X) < (Y)) ? (Y) : (X))  int binCharAdd(char a, char b, char *sum, int c) {     int cin;     cin = (a & 0x01) + (b & 0x01) + (c >> 1);     *sum = (cin & 0x01) + 0x30;     return (cin & 0x02); }  char * addBinary(char * a, char * b) {     int aLen = strlen(a);     int bLen = strlen(b);     int maxLen = MAX(aLen, bLen);     int minLen = MIN(aLen, bLen); //    char *sum = (char *)malloc(sizeof(char) * (maxLen + 1));     char sum[1001];     char *pt = sum;     for(int i = 0; i < maxLen + 1; i ++)     {         sum[i] = '0';     }     sum[maxLen + 1] = 0;     if (aLen > bLen)     {         memcpy(&sum[aLen - bLen + 1], b, bLen);     }     else     {         memcpy(&sum[bLen - aLen + 1], a ,aLen);     }     int cin = 0;     for(int i = maxLen; i > 0; i --)     {          cin = binCharAdd(sum[i], aLen > bLen ? a[i - 1] : b[i - 1], &sum[i], cin);     }     if (cin == 2)     {         sum[0] = '1';     }     while(*pt == '0' && pt != &sum[maxLen])     {         pt ++;     }     return pt; }  int main() {     char a[1000];     char b[1000];     char *c;     while(scanf("%s%s", a, b) == 2)     {         c = addBinary(a, b);         printf("%s\r\n",c);     }     return 0; }    试试这个？ 代码有点点乱，不好意思。

user: user-3
content: 引用 12 楼 悲伤的小霉 的回复：[quote=引用 11 楼 bsnow的回复:]我终于读懂这个题了 二进制长度最大 1000位，所以INT肯定存不下。  字符串就可以没问题了。 嗯嗯，有什么好办法吗？我用c写不出来[/quote]我试试，最近都在做硬件 这些题好久没碰了

user: user-3
content: #include <stdio.h> #include <string.h> #include <stdlib.h>  #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) #define MAX(X, Y) (((X) < (Y)) ? (Y) : (X))  int binCharAdd(char a, char b, char *sum, int c) {     int cin;     cin = (a & 0x01) + (b & 0x01) + (c >> 1);     *sum = (cin & 0x01) + 0x30;     return (cin & 0x02); }  char * addBinary(char * a, char * b) {     int aLen = strlen(a);     int bLen = strlen(b);     int maxLen = MAX(aLen, bLen);     int minLen = MIN(aLen, bLen);     char *sum = (char *)malloc(sizeof(char) * (maxLen + 2));     char *pt;     for(int i = 0; i < maxLen + 1; i ++)     {         sum[i] = '0';     }     sum[maxLen + 1] = 0;     if (aLen > bLen)     {         memcpy(&sum[aLen - bLen + 1], b, bLen);     }     else     {         memcpy(&sum[bLen - aLen + 1], a ,aLen);     }     int cin = 0;     for(int i = maxLen; i > 0; i --)     {          cin = binCharAdd(sum[i], aLen > bLen ? a[i - 1] : b[i - 1], &sum[i], cin);     }     if (cin == 2)     {         sum[0] = '1';     }     pt = sum;     while(*pt == '0' && pt != &sum[maxLen])     {         pt ++;     }     return pt; }  int main() {     char a[1001];     char b[1001];     char *c;     while(scanf("%s%s", a, b) == 2)     {         c = addBinary(a, b);         printf("%s\n",c);     }     return 0; }    这个程序是通过了的。

user: user-0
content: 那个还是不行，我自己在电脑上运行第25行报了个错，https://nuoyanli.com/contest/24/problem/D这个是原题的网站，你看看。

user: user-0
content: 引用 11 楼 bsnow的回复:我终于读懂这个题了 二进制长度最大 1000位，所以INT肯定存不下。  字符串就可以没问题了。 嗯嗯，有什么好办法吗？我用c写不出来

user: user-3
content: 我终于读懂这个题了 二进制长度最大 1000位，所以INT肯定存不下。  字符串就可以没问题了。