• LightOJ 1214 Large Division


    Large Division

      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

    解题思路:
      本题考查大数运算,每次测试给定一个整数T为测试数量,之后跟随T行,每行都给出两个数字,第一个数字是一个大于10200  且小于10200的数字,第二个数字是一个32位的int,要求计算第一个数是否可以整除第二个数,若可以整除输出divisible否则输出not divisible。

      由于第一个数字超出可以直接存储的范围太多,我们不能直接对其进行运算,那么就换一种运算方式,按位对其进行运算,至于如何按位运算,小学时学过对数字运算极为方便的方法——竖式。

      以12345678 / 9为例子

      由于题目中已经告诉我们输入的数字中不包含先导0,所以按照小学的算法我们用第一个数首位除数除以第二个数,9 除以 1得0余1,继续运算将余数1与下一个数结合得到12, 12除以9得1余3,将3与下一个数结合,得到33,以此类推直到运算到最后一位,我们便可以得到最终的余数。之后判断余数是否为0就可以得出答案。

      

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn = 200+10;
     5 struct Big{ //Big储存输入的大数
     6     int num[maxn];
     7     int len;
     8     Big(){
     9         len = 0;
    10         memset(num, 0, sizeof(num));
    11     }
    12 };
    13 int divide(Big a, int b){   //传入被除数与除数
    14     Big c;
    15     LL mod = 0; //mod记路余数
    16     for(int i = 0; i < a.len; i++){ //从首位开始按位运算
    17         mod = mod * 10 + a.num[i];  //mod要用long long 因为mod * 10后可能超int范围
    18         if(mod >= b)    //如果除不开就去计算下一位,除的开就进行计算
    19             mod = mod % b;  //当前值除以b找到新的余数
    20     }
    21    return (int)mod;
    22 }
    23 int main()
    24 {
    25     int t, b;   //t为测试数量
    26     string str; //str记录输入第一个数字
    27     while(scanf("%d", &t) != EOF){
    28         for(int i = 1; i <= t; i++){
    29             cin >> str >> b;
    30             Big a;  //a记录第一个数
    31             if(str[0] == '-'){  //第一个数字如果是负数就去掉符号
    32                 int cnt = 0;
    33                 a.len = str.size() - 1;
    34                 for(string::iterator it = ++str.begin(); it != str.end(); it++){
    35                     a.num[cnt++] = *it - '0';
    36                 }
    37             }else{  //正数直接记录入a
    38                 int cnt = 0;
    39                 a.len = str.size();
    40                 for(string::iterator it = str.begin(); it != str.end(); it++){
    41                     a.num[cnt++] = *it - '0';
    42                 }
    43             }
    44             if(b < 0)
    45                 b = -b;
    46             if(!divide(a, b)){  //只要mod为0就可以整除,否则不能整除
    47                 printf("Case %d: divisible
    ", i);
    48             }else{
    49                 printf("Case %d: not divisible
    ", i);
    50             }
    51         }
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    Java生成json
    WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互
    聚集索引和非聚集索引的区别
    如何编写函数才能提高代码质量
    前端程序员应该知道的15个 jQuery 小技巧
    FileShare枚举的使用(文件读写锁)
    ASP.NET MVC 数据库依赖缓存的实现
    C# 调用一个按钮的Click事件(利用反射)
    解决报错“超时时间已到。超时时间已到,但是尚未从池中获取连接”的方案
    关于浏览器URL中出现会话验证字符说明
  • 原文地址:https://www.cnblogs.com/suvvm/p/9985971.html
Copyright © 2020-2023  润新知