REEEEEEE

B3849 [GESP样题 三级] 进制转换

mason1 @ 2024-05-26 09:16:27

具体看代码,RE了```cpp

include<bits/stdc++.h>

using namespace std; int n,r,i; string a[1000010]; int main(){ std::cin>>n>>r; while(n!=0){ if(n%r==0){ a[i]='0'; for(int j=i;j>=0;j--){ std::cout<<a[j]; } return 0; }else if(n%r>=10){ a[i]=n%r+'A'; i++; }else{ a[i]=char(n%r); i++; } } for(int j=i;j>=0;j--){ std::cout<<a[j]; } return 0; }


服了

by jcf666 @ 2024-05-26 09:34:08

这markdown写得真是不堪入目。(修改一下)

具体看代码,RE了

#include<bits/stdc++.h> 
using namespace std; 
int n,r,i; 
string a[1000010]; 
int main(){ 
    std::cin>>n>>r; 
    while(n!=0){ 
        if(n%r==0){ 
            a[i]='0'; 
            for(int j=i;j>=0;j--){  
                std::cout<<a[j]; 
            }
            return 0;            
        }
        else if(n%r>=10){ 
            a[i]=n%r+'A'; i++; 
        }
            else{ 
            a[i]=char(n%r); i++; 
        } 
    } 
    for(int j=i;j>=0;j--){ 
        std::cout<<a[j];
    }
    return 0; 
  }

by jcf666 @ 2024-05-26 09:45:48

你RE的原因很简单,就是n没有除,导致的死循环


by jcf666 @ 2024-05-26 10:07:32

AC代码:

#include<bits/stdc++.h> 
using namespace std; 
int n,r,i; 
char a[1000010]; 
int main(){ 
    cin>>n>>r; 
    while(n!=0){ 
        int k=n%r;
        if(k>=10){ 
            k=k-10;
            a[i]=k+'A'; i++; 
        }
     else{ 
            a[i]=char(k+'0'); i++; 
        } 
        n/=r;
    } 
    for(int j=i-1;j>=0;j--){ 
        cout<<a[j];
    }
    return 0; 
  }

改了几个点:

1.char(n%r)并不能直接将n%r转换为对应的字符,会出现其他字符,应加上+'0'就能转化为对应的数字了。

2.在循环末尾加上n/=r,这也是你程序RE的原因

  1. n%r未-10,会导致字母‘N’变成‘X’(就是ASCll码比预想大了10)

4.a为字符数组即可,没必要定义为string类型

5.引用std命名空间后,就没必要再在cin和cout前加std::了

6.进制转换中央出现0的情况很多,而你的程序再见到0时就直接终止了,导致输出过短


by mason1 @ 2024-05-30 20:44:17

@jcf666 think you


by yyh2024 @ 2024-06-03 21:21:24

@jcf666 6


|