吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1307|回复: 10
收起左侧

[已解决] C语言---PAT---1017 A除以B (20 分)习题---部分错误

[复制链接]
answdl 发表于 2022-1-31 21:27
本帖最后由 answdl 于 2022-2-5 12:19 编辑

大佬们,除夕快乐
我写的这个代码,这个部分错误把我看懵了
请问这个错误是要怎么改正? 111捕获.PNG
代码:
[C] 纯文本查看 复制代码
#include <stdio.h>
//123456789050987654321 7
//123456789050987654321 = 7 * 17636684150141093474 + 3
//17636684150141093474 3
int main()
{
        int A, B;
        int Q = 0, R = 0;//使得 A=B*Q+R 成立。
        char flag[1001] = { 0 };//存储其中 A 中不超过 1000 位的正整数
        char* _flag = flag;
        int j = 0;//记录位移
        scanf("%s%d", flag, &B);//格式化输入
        while (1)
        {
                _flag += j;//纠正指针,指向正确位置
                if (*_flag == '\0')break;//退出循环
                sscanf(_flag,"%8d%n", &A, &j);//格式化输入/%n为读取输入的字符宽度(个数)
                int temp = 1;
                for (int i = 0; i < j; i++)
                        temp *= 10;
                A = R * temp + A;//加上上一次循环的余数
                R = A % B;
                Q = A / B;
                printf("%d", Q);
        }
        printf(" %d\n", R);
        return 0;
}


提交运行的结果:
222捕获.PNG

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2022-1-31 23:58
本帖最后由 jixun66 于 2022-2-1 00:07 编辑

[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>
#include <sstream>

void large_devide(const char* a, int b, std::string& result_q, std::string& result_r) {
    std::stringstream q;

    bool is_first = true;
    int value = 0;
    while (*a) {
        value = value * 10 + (*a - '0');
        int tmp_q = value / b;
        int tmp_r = value % b;
        if (!is_first || tmp_q != 0) {
            q << char('0' + tmp_q);
            is_first = false;
        }
        value = tmp_r;
        a++;
    }

    result_q = q.str();
    if (result_q.size() == 0) {
        result_q = "0";
    }

    char r[2] = { '0' + value , 0 };
    result_r = r;
}

int main()
{
    std::string q;
    std::string r;
    large_devide("123456789050987654321", 7, q, r);
    std::cout << q << " " << r << std::endl;
    system("pause");
    return 0;
}


用你的代码跑你给的测试案例没啥问题
unmask 发表于 2022-2-1 01:24
本帖最后由 unmask 于 2022-2-1 02:01 编辑

测试案例数字小时,没有问题,超过int最大值时,会出现大数问题,比如你的int Q,就会爆内存,无法计算正确的。
商数Q用char[1000 + 1]去定义,每次按照小学时学习的除法竖式,一位一位计算出结果push到Q中,楼上的用的C++,思想是一致的。

[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>
//123456789050987654321 7
//123456789050987654321 = 7 * 17636684150141093474 + 3
//17636684150141093474 3
int main()
{
    char A[1001] = {0}; //存储其中 A 中不超过 1000 位的正整数
    int B;
    char Q[1001] = {0};
    int R = 0; //使得 A=B*Q+R 成立。
    
    scanf("%s%d", A, &B); //格式化输入
    char *pa = A - 1;
    int iq = 0;
    while (*++pa)
    {
        short _A = *pa - '0' + R * 10;
        short _Q = _A / B;
        R = _A % B;
        if (_Q || iq)
        {
            Q[iq++] = _Q + '0';
        }
    }
    printf("%s %d\n", Q, R);
    return 0;
}
头像被屏蔽
tl;dr 发表于 2022-2-1 05:32
黑夜·执魔 发表于 2022-2-1 14:02
int最多是2147483647,long long 也没有1000位,自己做个高精度数组就行
 楼主| answdl 发表于 2022-2-1 20:57
sscanf(_flag, "%1d%n", &A, &j);
这一行代码把8改成了1就能通过测试
完全不知道为什么

修改了几个地方,但还是不知道错误是什么(8改成了1后就通过了,哈哈哈,能跑进行)
[C] 纯文本查看 复制代码
#include <stdio.h>
//123456789050987654321 7
//123456789050987654321 = 7 * 17636684150141093474 + 3
//17636684150141093474 3
int main()
{
	int A, B;
	int Q = 0, R = 0;//使得 A=B*Q+R 成立。
	char flag[1001] = { 0 };//存储其中 A 中不超过 1000 位的正整数
	char* _flag = flag;
	int j = 0;//记录位移
	unsigned int key = 1;//记录第几次循环
	scanf("%s%d", flag, &B);//格式化输入
	while (*_flag == '0')_flag++;//如果首位为0,先排除
	while (1)
	{
		_flag += j;//纠正指针,指向正确位置
		if (*_flag == '\0')break;//退出循环
		sscanf(_flag, "%1d%n", &A, &j);//格式化输入/%n为读取输入的字符宽度(个数)
		int temp = 1;
		for (int i = 0; i < j; i++)
			temp *= 10;
		A = R * temp + A;//加上上一次循环的余数
		R = A % B;
		Q = A / B;
		if (key++ == 1 && Q == 0 && *(_flag + 1) != '\0')continue;//特别对待A<B时
		if (A < temp / 10)//若输入为 70,000,000,001  7//即前一次R为0,且现一次A的位数低于当前j,(如 001  A==1 实际是001)
			printf("%0*d", j, Q);
		else
			printf("%d", Q);
	}
	printf(" %d\n", R);
	return 0;
}
 楼主| answdl 发表于 2022-2-1 21:04
jixun66 发表于 2022-1-31 23:58
[mw_shl_code=cpp,true]
#include
#include

新年快乐
感谢大佬的建议
我改成一位一位的算成功了,大于一位的方式就错误了

我发现我之前代码的一些错误
如 700000000 00000000 001   7
第二段的 8 个 0 会被压成一个0,001变成1
或者输入 0011  5  也会输出不合适的值
 楼主| answdl 发表于 2022-2-1 21:10
unmask 发表于 2022-2-1 01:24
测试案例数字小时,没有问题,超过int最大值时,会出现大数问题,比如你的int Q,就会爆内存,无法计算正确 ...

新年快乐
感谢大佬的建议
一位一位的算是正确的
但我是8位8位的算,余数都是个位数,加起来才9位数(int最大值有10位)
我感觉是没有啥问题的,但代码跑起来就错了
 楼主| answdl 发表于 2022-2-1 21:12
tl;dr 发表于 2022-2-1 05:32
出处是哪里呀?

PAT
计算机程序设计能力考试 的 真题练习(乙级)
我是在这里做这些题的
https://www.patest.cn/practice
 楼主| answdl 发表于 2022-2-1 21:19
黑夜·执魔 发表于 2022-2-1 14:02
int最多是2147483647,long long 也没有1000位,自己做个高精度数组就行

用字符数组存了
用sscanf截取数据给int类型变量
%8d,最多截8位数值
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表