【高精度】大整数的因子
题目相关
【题目描述】
已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。
【输入】
一个非负整数c,c的位数≤30。
【输出】
若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。
【输入样例】
30
【输出样例】
2 3 5 6
分析
本题考查的高精度除法。求出c除k的余数,余数为0则输出k。并且计算过程中只有被除数是高精度大数,而除数是个整数型的数字。
for(int k=2;k<=9;k++){
if(c MOD k ==0){
cout<<k<<" ";
}
}
在过程中我们可以模拟竖式计算的过程来实现。除法计算时,是从高位开始,取出一位位的数字依次和除数相除,有余数,则将余数和下一位数字组成新的数继续相除,直到所有数的用完为止。
int res=0;//余数
int newNum=0;//组成的新数
for(int i=0;i<len;i++){
newNum=res*10+c[i];
res=newNum%k;//计算余数
ans[i]=newNum/k;//计算商
}
代码实现
#include <iostream>
#include <cstring>
using namespace std;
int numMod(char s[],int k){
int c[35]={0};
int len=strlen(s);
for(int i=0;i<len;i++){
c[i]=s[i]-'0';
}
int res=0;
int newNum=0;
for(int i=0;i<len;i++){
newNum=res*10+c[i];
res=newNum%k;
}
return res;
}
int main(){
char C[35]={0};
bool flag=false;
cin>>C;
for(int k=2;k<=9;k++){
if(numMod(C,k)==0){
flag=true;
cout<<k<<" ";
}
}
if(!flag){
cout<<"none";
}
return 0;
}
视频链接
源码
源码上传至Git仓库中,欢迎star!
不积硅步,无以至千里。