Light Oj 1214 大数整除

本文介绍了一种解决大数整除问题的算法,并通过一个具体的编程实例进行演示。该算法能够判断一个大数是否能被另一个较小的整数整除,适用于大数运算场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Large Division
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu
Submit

Status

Practice

LightOJ 1214
Description
Given two integers, a and b, you should check whether a is divisible by b or not. We know that an integer a is divisible by an integer b if and only if there exists an integer c such that a = b * c.

Input
Input starts with an integer T (≤ 525), denoting the number of test cases.

Each case starts with a line containing two integers a (-10200 ≤ a ≤ 10200) and b (|b| > 0, b fits into a 32 bit signed integer). Numbers will not contain leading zeroes.

Output
For each case, print the case number first. Then print 'divisible' if a is divisible by b. Otherwise print 'not divisible'.

Sample Input
6

101 101

0 67

-101 101

7678123668327637674887634 101

11010000000000000000 256

-202202202202000202202202 -101

Sample Output
Case 1: divisible

Case 2: divisible

Case 3: divisible

Case 4: not divisible

Case 5: divisible

Case 6: divisible

<span style="color:#6600cc;">/*******************************************
   
     author   :   Grant Yuan
     time     :   2014.8.7
     algorithm:   大数整除
     source   :   Light Oj 1214
     explain  :  从ans初始化为0,最低位开始ans=(ans+s[i]-'0')%b;
                  计算到最后,如果ans 等于0,可以整除;
                  否则,不可以整除;
                  
**********************************************/

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define INF 0x3fffffff

using namespace std;

char s[2000002];
int b;
long long ans;
int t;

int main()
{
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {    memset(s,0,sizeof(s));
        scanf("%s%d",&s,&b);
        if(b<0) b=-b;
        int l=strlen(s);
        ans=0;
        for(int j=0;j<l;j++)
        {
            if(s[j]=='-') continue;
            ans=(ans*10+(s[j]-'0'))%b;
        }
        if(ans==0)
            printf("Case %d: divisible\n",i);
        else
            printf("Case %d: not divisible\n",i);
    }
    return 0;
}
</span>


 

转载于:https://www.cnblogs.com/codeyuan/p/4254457.html

在银行系统中,整除和零取问题通常出现在账户余额处理、利息计算、货币兑换、支付分账等场景。这些场景需要精确处理金额,避免因舍入或分配不当导致的资金错误。以下是几个常见的问题及解决方案: ### 1. 余额分配问题 在某些金融场景中,例如将总金额平均分配到多个账户时,可能会遇到无法整除的情况。例如,将100元平均分配到3个账户,每个账户分配33.33元,但总和会少0.01元。 **解决方案**: - **精确计算**:使用高精度的数值类型,如Java中的`BigDecimal`或Python中的`decimal`模块,以避免浮点数精度问题。 - **尾差处理**:在分配时,先计算整除部分,然后将余数依次加到前面的账户中。例如,100元分配到3个账户时,可以分别分配33.34元、33.33元、33.33元。 ### 2. 利息计算中的整除问题 银行在计算利息时,特别是按日计息或按月复利的情况下,可能会遇到无法整除的金额。 **解决方案**: - 使用精确的利息计算公式,并在最终结果中采用四舍五入或截断方式处理。 - 在多期利息计算中,可以采用“尾差调整”策略,确保总利息与理论值一致。 ### 3. 零取问题(零钱提取) 在ATM取款或现金支付中,用户可能希望提取特定金额的零钱,例如希望获得50元、20元、10元等面额的组合。 **解决方案**: - 使用贪心算法或动态规划算法来计算最优的面额组合。 - 例如,若用户希望提取130元,系统可以优先选择大面额纸币(如100元),然后处理剩余金额(如30元可拆分为20元+10元)。 ```python def make_change(amount): denominations = [100, 50, 20, 10, 5, 1] change = {} for d in denominations: count = amount // d if count > 0: change[d] = count amount -= count * d if amount == 0: break return change ``` ### 4. 分账与多账户结算 在支付系统中,可能需要将一笔金额分账到多个商户或用户账户中,这同样会遇到无法整除的问题。 **解决方案**: - 在分账逻辑中引入“尾差账户”,将无法整除的部分分配给指定账户。 - 使用精确的金额分配策略,并在数据库中记录每一步的分配结果,确保资金平衡。 ### 5. 零头处理与四舍五入策略 在银行系统中,涉及金额的计算通常需要四舍五入,但不同国家和地区可能有不同的规范。 **解决方案**: - 明确四舍五入规则,并在系统中统一实现。 - 对于涉及金融交易的系统,建议使用银行家舍入法(Round Half to Even),即当舍入位为5时,前一位为偶数则舍去,奇数则进位。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值