PTA1017 A除以B

2024-02-03 03:58
文章标签 除以 pta1017

本文主要是介绍PTA1017 A除以B,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

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

输入格式:

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

输出格式:

在一行中依次输出 Q 和 R,中间以 1 空格分隔。

输入样例:

123456789050987654321 7

输出样例:

17636684150141093474 3

直接套了大数模板

代码:

#include<stdio.h>
#include<string.h>

char a[100],b[100];//用两个字符串用来输入两个大数

int x[100],y[100],z[100],m[100];//被除数  除数  商  余数

int digit;  //大数的位数

void sub(int x[],int y[],int len1,int len2)//大数减法
{
    int i;
    for(i=0;i<len1;i++)
    {
        if(x[i]<y[i])
        {
            x[i]=x[i]+10-y[i];
            x[i+1]--;
        }
        else
            x[i]=x[i]-y[i];
    }
    for(i=len1-1;i>=0;i--)//判断减法结束之后,被除数的位数
    {
        if(x[i])
        {
            digit=i+1;
            break;
        }
    }
}
int judge(int x[],int y[],int len1,int len2)
{
    int i;
    if(len1<len2)
        return -1;
    if(len1==len2)//若两个数位数相等
    {
        for(i=len1-1;i>=0;i--)
        {
            if(x[i]==y[i])//对应位的数相等
                continue;
            if(x[i]>y[i])//被除数 大于 除数,返回值为1
                return 1;
            if(x[i]<y[i])//被除数 小于 除数,返回值为-1
                return -1;
        }
        return 0;//被除数 等于 除数,返回值为0
    }
}
int main()
{
    int i,j=0,k=0,temp;
    int len1,len2,len;//len两个大数位数的差值

    while(~scanf("%s %s",a,b))
    {
        len1=strlen(a);//被除数位数
        len2=strlen(b);//除数位数

        for(i=len1-1,j=0;i>=0;i--)//将字符串中各个元素倒序储存在数组中
        {
            x[j++]=a[i]-'0';
        }
        for(i=len2-1,k=0;i>=0;i--)
        {
            y[k++]=b[i]-'0';
        }

        if(len1<len2)//当被除数位数 小于 除数位数时
        {
            printf("商是:0\n");
            printf("余数是:");
            puts(a);
        }
        else //当被除数位数 大于或者等于 除数位数时
        {
            len=len1-len2;//两个大数位数的差值
            for(i=len1-1;i>=0;i--)//将除数后补零,使得两个大数位数相同。
            {

                if(i>=len)
                    y[i]=y[i-len];
                else
                    y[i]=0;

            }
            len2=len1;//将两个大数数位相同

            digit=len1; //将原被除数位数赋值给digit

            for(j=0;j<=len;j++)
            {
                z[len-j]=0;

                while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数的大小以及被除数位数与除数原位数的关系
                {
                    sub(x,y,len1,len2); //大数减法函数

                    z[len-j]++;//储存商的每一位

                    len1=digit;//重新修改被除数的长度

                    if(len1<len2&&y[len2-1]==0)//新的被除数位数减少并且被除数是加0的被除数
                        len2=len1;  //将len1长度赋给len2;
                }
                if(temp<0)//若被除数 小于 除数,除数减小一位。
                {
                    for(i=1;i<len2;i++)
                        y[i-1]=y[i];
                    y[i-1]=0;
                    if(len1<len2)
                        len2--;
                }
            }

            //printf("商是:");
            for(i=len;i>0;i--)//去掉前缀0
            {
                if(z[i])
                    break;
            }
            for(;i>=0;i--)
                printf("%d",z[i]);
            printf(" ");

            //printf("余数是:");
            for(i=len1;i>0;i--)
            {
                if(x[i])
                    break;
            }
            for(;i>=0;i--)
                printf("%d",x[i]);
            printf("\n");
        }
    }
    return 0;
}

 

这篇关于PTA1017 A除以B的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672923

相关文章

高精度加、减、乘、除(高精除以低精)

高精度加法 法1:P1601 A+B Problem(高精) #include <bits/stdc++.h>using namespace std;char s1[510], s2[510];int a[510], b[510], sum[510];int lena, lenb, lens;int main(){cin >> s1 >> s2;lena=strlen(s1);le

PTA L1-037 A除以B

L1-037 A除以B(10分) 真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。 输入格式: 输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。 输出格式: 在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商

numpy除以0时赋值100

在NumPy中,默认情况下,当你尝试除以0时,会引发一个错误,因为数学上除以0是未定义的。但是,如果你想要定义除以0的行为,可以通过自定义数学函数来实现,或者使用条件语句来处理异常情况。 下面是一个例子,展示了如何在NumPy数组中处理除以0的情况,使得结果为100: # 定义一个处理除以0的函数def safe_divide(x, y):with np.errstate(divide

transfomer中attention为什么要除以根号d_k

简介 得到矩阵 Q, K, V之后就可以计算出 Self-Attention 的输出了,计算的公式如下: A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T d k ) V Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=Softmax(dk​

为什么self-attention要除以一个根号dk

简单说法是为了让方差到1,推公式也好推。但是没几个人说为什么方差要到1. 如果不除以根号dk,显然QK有可能很大,这就让softmax更有能力得到接近one-hot的结果。这本应是好的,但是从实践来看,我们并不要求一定要输出one-hot,这有点over-fitting的感觉了。差不多就行。 还有更重要的理由。softmax求导是 a − a 2 a-a^2 a−a2, a a a是softmax

PAT B1017 -- A除以B

牛客网PAT乙级第七题,A除以B,题目描述大致如下: 计算A/B,输入A,B,以空格分隔,A是不超过1000位的正整数,B是1位正整数,输出余数Q和商R,空格分离,使得A=B*Q+R成立。 题目要求的输入输出如下: 代码如下: #include <iostream>#include <string>using namespace std;int main(){string

用python分析处理药店销售数据:得到以下三个指标:月消费次数,即总消费次数除以月份数,往往是销售部门重要的指标值之一。月均消费金额,总的消费金额除以月份数,主要作为部门收益的一个指标。(3

项目背景与目标  零售药店行业现状分析 药品零售作为一个传统行业,正受到新零售方式崛起、医改不断深化、行业监管逐步提升等挑战,零售药店位居医药产业链下游,是医药零售的重要终端。在中国,药店是指面向消费者销售医药产品和各类健康产品的零售门店,近年来也发展出网上药店这类线上终端。而中国药店渠道仅占药品总销售约2成,如将我国药品销售分为医院、药店和基层医疗机构三大终端,药品在药店渠道销售占比约为22

高精度之高精度除法(高精除以高精)

好像NOIP并不会用到,但是作为强迫症的我还是坚持学了。高精度除以高精度我所知道的有两个思路: 手动模拟法 还是手动模拟除法过程,但是注意在截取了被除数的正确片段之后应该试商,即枚举k从1到9看当k等于多少才合适,但是如果每次循环都试一边的话时间复杂度必定会很高,优化的方法就是在开始时就把k乘以除数的值记录下来,程序执行时只要二分比较确定K值就行了。 但是这种方法实现起来太过麻烦,比较大小时

高精度之高精度除法(高精除以低精)

一.整除版高精度除法: 思路,手动模拟除法过程,包括余数用X记录,每次读到新位计算出被除数,然后计算。 //高精度除法 整除版 #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<functional>#include<vector>#include<iterator>us

1017 A除以B (20 分) ( JAVA )

1017 A除以B (20 分) 本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。 输入格式: 输入在一行中依次给出 A 和 B,中间以 1 空格分隔。 输出格式: 在一行中依次输出 Q 和 R,中间以 1 空格分隔。 输入样例: 123456789050987654321 7 输出