PAT Grado B 1017 A dividido por B (20 puntos) - dos métodos

contenido del tema

Este problema pide calcular A/B, donde A es un número entero positivo de hasta 1000 dígitos y B es un número entero positivo de 1 dígito. Debe generar el cociente Q y el resto R de modo que se mantenga A = B × Q + R.

Formato de entrada:

La entrada da A y B secuencialmente en una línea, separados por 1 espacio.

Formato de salida:

Salida Q y R en secuencia en una línea, separados por 1 espacio.

Muestra de entrada:

123456789050987654321 7

sin línea en blanco al final

Salida de muestra:

17636684150141093474 3

sin línea en blanco al final

Ideas para resolver problemas

Método un método común

Este problema es un problema clásico de computación de alta precisión. El rango de A en el problema no es más de 1000 dígitos, por lo que no debemos usar mucho para evaluar violentamente. El tipo de cadena lee A, calcula cada bit de la cadena por separado, calcula un bit y genera un bit.

El método 2 usa el vector para hacer

Usando las características del vector para facilitar la inserción y eliminación, la cadena se almacena en el vector en orden inverso, y luego los datos se recorren y almacenan en el vector.Después de procesar los resultados especiales, se pueden generar en orden inverso.

Código detallado

método uno

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    string A;
    int B;
    int Q = 0,R = 0;  //Q表示商,R表示每次运算的余数
    bool isFirst = true;
    cin>>A>>B;
    for(int i = 0;i<A.length();i++){
        Q = (R*10+A[i]-'0')/B;
//Q为0只有不在字符串的头一个且整个字符串的长度不唯一或者字符串长度为1时才输出
        if(isFirst&&A.length()>1){  
            if(Q!=0){
            cout<<Q;
            isFirst = false;
            }
        }else{
            cout<<Q;
        }
        R = (R*10+A[i]-'0')%B;
    }
    cout<<" "<<R;
}

Método dos

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> div(vector <int> a,int b,int &r){
    vector <int> c;  //用于存放计算结果
    int y = 0;  
    for(int i = a.size()-1;i>=0;i--){
        y = y*10+a[i];  //y表示余数
        c.push_back(y/b);
        y=y%b;
    }
    r = y; //保留最后的余数
    reverse(c.begin(),c.end());  //c不是最后的结果,他是结果的逆序,所以逆转过来以后会存在首值为0的情况,所以我们需要提前逆转过来,删除首部的0
    while(c.size()>1&&c.back()==0) c.pop_back();
      return c;
}
int main(){
    string a;
    int b,r;
    cin>>a>>b;
    vector <int> A;
//为了方便计算,将字符串a逆着写入vector中
    for(int i = a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); 
   vector <int> c = div(A,b,r);
    for(int i = c.size()-1;i>=0;i--) cout<<c[i];
    cout<<" "<<r;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45660485/article/details/119295984
Recomendado
Clasificación