原题干:
本题要求计算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;
}