13:大整数的因子
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。
输入
- 一个非负整数c,c的位数<=30。 输出
- 若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。 样例输入
-
30
样例输出
2 3 5 6
//noi_1927
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
using namespace std;
int a[35]={0},c[35]={0};
int b=0,d=0,ok=0;
void printa(int a[]){
if(a[0]==0) {
cout<<0;
return;
}
for(int i=1;i<=a[0];i++){
cout<<a[a[0]+1-i];
}
}
void initial(int a[]){
string s;
cin>>s;
a[0]=s.length();
for(int i=1;i<=a[0];i++){
a[i]=s[a[0]-i]-'0';
}
for(int i=a[0];i>=1;i--){
if(a[i]==0) a[0]--;
else break;
}
}
void chudan(int a[],int b,int c[])//商c=a/b,余数d=a%b
{ int i;
d=0; //余数初始化
for(i=a[0];i>=1;i--) //按照由高位到低位的顺序,逐位相除
{ d=d*10+a[i]; //接受了来自第i+1位的余数
c[i]=d/b; //计算商的第i位
d=d%b; //计算第i位的余数
// printa(c);
//cout<<' ';
}
c[0]=a[0];
while(c[0]>0&&c[c[0]]==0) c[0]--;//计算商的有效位数
}
int main(){
initial(a);
for(int i=2;i<=9;i++){
chudan(a,i,c);
if(d==0) {
cout<<i<<' ';
ok=1;
}
}
if(ok==0) cout<<"none";
return 0;
}
高精度除法,情况非常多,要一一处理。