PTA乙级 1017 A除以B (20分) 高精度-大数

强烈推荐,刷PTA的朋友都认识一下柳神–PTA解法大佬

本文由参考于柳神博客写成

柳神的CSDN博客,这个可以搜索文章

柳神的个人博客,这个没有广告,但是不能搜索

题目原文

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

输入格式:

输入在一行中依次给出 AB,中间以 1 空格分隔。

输出格式:

在一行中依次输出 QR,中间以 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;
}

结尾

如果这篇文章对你有张帮助的话,可以用你高贵的小手给我点一个免费的赞吗

相信我,你也能变成光.

在这里插入图片描述

如果你有任何建议,或者是发现了我的错误,欢迎评论留言指出.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值