描述
已知正整数 k 满足 2<=k<=9,现给出长度最大为 30 位的十进制非负整数 c,求所有能整除 c 的 k。
-
输入
-
输入从文件 bignum.in 读取。若干个非负整数 c,c 的位数 <= 30。每行一个 c,当 c=-1 时中止(不要对-1进行计算!)
输出
-
请把结果保存到 bignum.out 中,每一个 c 的结果占一行。
1) 若存在满足 c % k == 0 的 k,输出所有这样的 k,中间用空格隔开,最后一个 k 后面有空格。
2) 若没有这样的 k 则输出 "none"。
模拟题
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<memory.h>
using namespace std;
ifstream fin( "bignum.in" );
ofstream fout( "bignum.out" );
#define cin fin
#define cout fout
char list[100];
int num[100];
int total;
int f(){
int k=0;
int num2[100];
memcpy(num2,num,total*sizeof(int));
for(int i=1;i<total-2;i++){
k=10*num2[i-1]+num2[i];
num2[i-1]=0;
if(k%7){num2[i]=k%7;}
else {num2[i]=0;}
}
return ((100*num2[total-3]+10*num2[total-2]+num2[total-1])%7==0);
}
int test(){
bool jud=0;
if(total==1){if(num[0]%7==0)jud=1;}
if(total==2){if((10*num[total-2]+num[total-1])%7==0)jud=1;}
if(total==3){if((100*num[total-3]+10*num[total-2]+num[total-1])%7==0)jud=1;}
if(total>3)jud=f();
if(jud==1)return 1;
else return 0;
}
int main(){
while(scanf("%s",list)!=EOF){
if(list[0]=='-')break;
bool jud[10]={};
bool cont=0;
total=0;
memset(num,0,sizeof(num));
for(int i=0;i<100;i++){
if(list[i]=='\0')break;
num[i]=list[i]-'0';total=i+1;
}
if(num[total-1]%2==0){printf("2 ");jud[2]=1;cont++;}
int sub=0;
for(int i=0;i<total;i++){
sub+=num[i];
}
if(sub%3==0){printf("3 ");jud[3]=1;cont++;}
if(total==1){if(num[0]%4==0){printf("4 ");jud[4]=1;}}
else if((10*num[total-2]+num[total-1])%4==0)printf("4 ");
if(num[total-1]==0||num[total-1]==5){printf("5 ");cont++;}
if(jud[2]==1&&jud[3]==1)printf("6 ");
if(test()){printf("7 ");cont++;}
if(total>2){if((100*num[total-3]+10*num[total-2]+num[total-1])%8==0)printf("8 ");}
else if((10*num[total-2]+num[total-1])%8==0)printf("8 ");
if(sub%9==0)printf("9 ");
if(cont==0)printf("none");
printf("\n");
}
}