1171:大整数的因子
【题目描述】
已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。
【输入】
一个非负整数c,c的位数≤30。
【输出】
若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。
【输入样例】
30
【输出样例】
2 3 5 6
【来源】
No
代码
代码来源:
张老师和杜老师编程课
结构体真香!
#include<bits/stdc++.h>
using namespace std;
const int MAXLEN=10005;
struct BigInt{ //创建一个结构体
int len;
int a[MAXLEN];
};
void setBigInt(BigInt &a,char *s){ //读入数据
int len,i;
memset(a.a,0,sizeof(a.a));
len=strlen(s);
for(i=0;i<len;i++) a.a[i]=s[len-1-i]-'0'; //倒存数据
while(len>1&&a.a[len-1]==0) len--; //输入去前导零操作
a.len=len;
}
void printBigInt(BigInt &a){ //变单独的数字存放在数组中
int i;
for(i=a.len-1;i>=0;i--) printf("%d",a.a[i]);
}
void divideInt(BigInt &a,int divisor,int &remainder){ //错位相除方法
int i,rest=0;
for(i=a.len-1;i>=0;i--){
rest=rest*10+a.a[i];
a.a[i]=rest/divisor;
rest=rest%divisor;
}
remainder=rest; //判断去前导零操作
i=a.len;
while(i>1&&a.a[i-1]==0) i--;
a.len=i;
}
int main()
{
char s[MAXLEN];
BigInt a;
int i,count=0,r;
scanf("%s",s);
for(i=2;i<=9;i++){
setBigInt(a,s);
divideInt(a,i,r);
if(r==0){
count++;
if(count!=1) printf(" ");
printf("%d",i);
}
}
if(count==0) printf("none");
printf("\n");
return 0;
}