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)