标签:10 temp 高精度 int 30 char 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整除
标签:10,temp,高精度,int,30,char,7.6,一位数,整除 来源: https://www.cnblogs.com/cxs070998/p/11144730.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。