强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬
本文由参考于柳神博客写成
题目原文
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
思路如下:
创建一个结构体,用来保存这个高精度数.
typedef struct node {
int x[1000];
int len;
//构造函数
node() {
memset(x, 0, sizeof(x));
len = 0;
}
}Number;
memset就是数组的初始化函数.把全部的x都初始化位0
方便计算.
每一位都是按照相应的顺序的.
如果是加减和乘建议逆序保存
就是 12345
数组里面的是 54321
如果是除法建议正序保存.除法比较特殊.
然后就是我们的计算了.
用一个余数r来计算.
能除就出去,然后替换新的余数r.
不能就继续保留余数r
举个例子.
12789/78
1可以去78吗? 不能 保留 c的这一位是0
12 可以吗? 不能 保留 c的这意味是0 余数现在是12
127可以吗 可以 c 的这一位是1 余数现在是49
一次循环直到最后.
代码如下:
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
//大数字的结构体
typedef struct node {
int x[1000];
int len;
//构造函数
node() {
memset(x, 0, sizeof(x));
len = 0;
}
}Number;
// 读入大数字
Number scan(Number,string );
Number divide(Number , int,int &);
int main(void) {
Number a;
int b;
string sa;
cin >> sa>>b;
a = scan(a, sa);
int r = 0;
a = divide(a, b, r);
for (int i = a.len-1; i >= 0; --i) {
cout << a.x[i] ;
}
cout << " " << r;
return 0;
}//读入高精度数
Number scan(Number a,string b) {
a.len = b.length();
int lenth = b.length()-1;
for (auto i: b) {
a.x[lenth] = i - '0';
lenth--;
}
return a;
}
Number divide(Number a, int b,int &rmd) {
Number c;
c.len = a.len;
for (int i = a.len - 1; i >= 0; i--) {
rmd = rmd * 10 + a.x[i]; //和上一位遗留的余数组合
if (rmd < b)c.x[i] = 0; //不够除,该位为0
else { //够除
c.x[i] = rmd / b; //商
rmd= rmd % b;
}
}
while (c.len - 1 >= 1 && c.x[c.len - 1] == 0) {
c.len--; //去除高位的0,同时至少保留一位最低位.
}
return c;
}
我的代码是copy算法笔记的.
国际惯例,柳神的代码的
欣赏时间.
#include <iostream>
using namespace std;
int main() {
string s;
int a, t = 0, temp = 0;
cin >> s >> a;
int len = s.length();
t = (s[0] - '0') / a;
//为了防止,高精度数是一个个位数.
if ((t != 0 && len > 1) || len == 1)
cout << t;
temp = (s[0] - '0') % a;
for (int i = 1; i < len; i++) {
t = (temp * 10 + s[i] - '0') / a;
cout << t;
temp = (temp * 10 + s[i] - '0') % a;
}
cout << " " << temp;
return 0;
}
结尾
如果这篇文章对你有张帮助的话,可以用你高贵的小手给我点一个免费的赞吗
相信我,你也能变成光.
如果你有任何建议,或者是发现了我的错误,欢迎评论留言指出.