zoukankan      html  css  js  c++  java
  • 7.6 高精度数的整除

    今天为大家讲解一篇高精度数的整除,该题的中心思想为char数组的运用及数学思想,int整数取值范围为(-2^31,2^31-1)

    ,而30位的数已经超出了int范围,所以我们只能用char数组来进行运算,具体的解题思路即步骤在文末

    【题目描述】
      已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k


    【输入】
    一个非负整数c,c的位数≤30


    【输出】
    若存在满足c%k=0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;
    若没有这样的k,则输出"none"。
    【输入样例】

    30


    【输出样例】
     2 3 5 6

    题解代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    char s[31];
    int main(){
     cin>>s;
     int temp,flag=0;
     for(int i=2;i<=9;i++){
      temp=0;
      for(int j=0;j<strlen(s);j++){
       if(s[j]-'0'+temp>=i){
        temp=((s[j]-'0'+temp)%i)*10;
       }
       else{
        temp=(s[j]-'0')*10;
       }
      }
      if(temp==0){
       printf("%d ",i);
       flag=1;
      }
     }
     if(!flag) printf("none\n");
     return 0;
    }

    题解算法思想:

      该题的思路是从char数组中第一个元素即整数顶头的那一位数开始,挨个从char化为int,加上上一位数与k做取余运算得到的数temp

    (temp比当前的数高一位,所以在每次运算结束时都乘10供下一位数运算时使用)与k比较:

    循环中:

    1.temp+当前数大于等于k的时候,对k取余并乘10供下一位数使用;

    2.小于k的时候,说明temp为0且当前数小于k,直接将temp赋值为该数*10进入下一次循环

    注:以上两步便决定了当前所做的运算最高只能为两位数,有效的解决了高精度超过int范围的问题

    循环结束后,若temp==0则说明无余数,可以被当前数k整除

  • 相关阅读:
    Java多线程总结(二)锁、线程池
    Java多线程总结(一)多线程基础
    如何创建并运行java线程
    Java高效计数器
    在JLabel上显示图片,并且图片自适应JLabel的大小
    用java读写ini配置文件
    Java读取ini配置
    JAVA – 虚函数、抽象函数、抽象类、接口
    Java UDP Socket
    18、面向对象基本原则及UML类图简介
  • 原文地址:https://www.cnblogs.com/cxs070998/p/11144730.html
Copyright © 2011-2022 走看看