1017 A除以B (20分)
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
这道题目并不难,输入的数据用string型变量存放,计算的时候只需要把字符转换为对应的整形即可。注意在除的时候,是要分情况的,
首先看够不够除,够除的话还要看有没有余数?然后就是不够出的话,就要借位了;而且有的时候还不能借位,所以要考虑到所有可能的
情况。
下面附上代码,代码中注释了一些比较容易忽略的测试数据,可以测试一下
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 string A; 8 vector<int> Q; 9 short B=0,R,q,tem; 10 cin>>A>>B; 11 R=0; //初始化余数为0 12 for(unsigned int i=0;i<A.length();) 13 { 14 if((A[i]-'0')>=B&&R==0) //够除,并且上一次做除法是整除,余0 15 { 16 R=(A[i]-'0')%B; //取余数 17 q=(A[i]-'0')/B; //取商 18 Q.push_back(q); 19 i++; 20 } 21 else if((A[i]-'0')<B&&R==0) //不够除,就借一位,并且上一次做除法是整除,余0 22 { 23 if(i+1<A.length()) //借位的时候,判断有没有越界;如A=70、B=7或A=6、B=7,此时借位会越界 24 { 25 Q.push_back(0); //不够除,商零 26 tem=(A[i]-'0')*10+(A[i+1]-'0'); 27 R=tem%B; 28 q=tem/B; 29 Q.push_back(q); 30 i+=2; 31 } 32 else //如A=70、B=7或A=6、B=7,不能借位,直接取商取余输出并结束 33 { 34 if(i==0) //A=6、B=7 35 { 36 cout<<(A[i]-'0')/B<<" "<<(A[i]-'0')%B; 37 return 0; 38 } 39 if(i-1>=0) //A=70、B=7或A=71、B=7 40 { 41 Q.push_back(0); 42 R=(A[i]-'0')%B; 43 break; 44 } 45 } 46 } 47 else //上一次没有整除,有余数 48 { 49 tem=R*10+(A[i]-'0'); 50 R=tem%B; 51 q=tem/B; 52 Q.push_back(q); 53 i++; 54 } 55 } 56 for(unsigned int i=0;i<Q.size();i++ ) 57 { 58 if(i==0&&Q[i]==0) 59 continue; 60 cout<<Q[i]; 61 } 62 cout<<" "<<R; 63 return 0; 64 }
ac了