PAT-B 真题- 1017. A除以B

发布于 / PAT-乙级 / 0 条评论

原题干:

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式:

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式:

在1行中依次输出Q和R,中间以1空格分隔。

输入样例:

123456789050987654321 7

输出样例:

17636684150141093474 3

这是一个计算除法的题,当然不能直接去除。因为C语言中使用unsigned long long也无法表示1000位的正整数。我们想到了平时列竖式做除法时候的方法:

例如7129÷7,首先用7÷7=1,接着1÷7,等于0余1,余下的1跟着下一个2,即12÷7,等于1余5,最后59÷7。

把所有商写下就是结果,最后一次计算的余数就是最终的余数。

要记得判定是否为开头,如果是开头,不能输出0。如果循环完了仍然是开头,意味着一个数字也没输出,要输出0。

下面这个程序我是用C++的string写,用迭代器访问元素。你可以自由发挥,使用数组写,用数组下标访问元素亦可。

#include <string>
#include <iostream>
#include <cmath> 

using namespace std;

int stnum(char number){
  return (int)(number - '0');
}

int main(){
  string a;
  int b, ob = 0;
  bool first = true;
  cin>>a>>b;
  string::iterator it = a.begin();
  for(int i = 0; i < a.size(); i++){
    if(!ob){
      ob = stnum(*(it + i));
      if(ob >= b){
        cout<<ob/b;
        first = false;
        ob %= b;
      }else{
        if(!first)cout<<'0';
        continue;
      }
    }else{
      ob = 10 * ob + stnum(*(it + i));
      first = false;
      cout<<ob/b;
      ob %= b;
    }
  }
  if(first)cout<<'0';
  cout<<" "<<ob;
    return 0;
}

转载原创文章请注明,转载自: 斐斐のBlog » PAT-B 真题- 1017. A除以B
目前还没有评论,快来抢沙发吧~