时间限制: 1000 ms 内存限制: 65536 KB
提交数: 1296 通过数: 735
【题目描述】
已知正整数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 <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
char a[32]; //存的被除数
int flag=0,t,la; //flag表示是否有被除数的因子;t表示除后的余数
gets(a);
la=strlen(a);
for(int i=2;i<=9;i++) //除数从2循环到9
{
t=0;
for(int j=0;j<la;j++) //被除数从左向右依次被除
{
if(a[j]-'0'+t>=i) //当前位数够除时
{
t=((a[j]-'0'+t)%i)*10; //除法处理,余数t等于当前位数加上上一个余数除以除数然后乘以10
}
else //当前位数不够除时
{
t=(a[j]-'0')*10; //余数直接等于当前数乘以10
}
}
if(t==0)
{
cout<<i<<' ';
flag=1; //只要有一个除数可以完成被被除数整除就等于1
}
}
if(flag==0)
{
cout<<"none";
}
return 0;
}
【代码】
难点:除法处理t(余数的表示)
1.用flag表示是否有除数会被被除数整除,也就是是否有因子,一定要注意变换的位置,只要有一个因子是可以被整除的就要变换flag的值为1。
2.自己可以在草稿本上除一下,哈哈哈,你可以发现当进行除法运算的时候是从左向右运算的,所以此时是不需要倒序的;你还可以发现当第第一个数大于除数时(也就是够除),你除完以后会有一个余数,而这个余数会乘以10与后面那个数加起来再判断是否大于除数,以此类推,如果当前数加上余数乘以10之后还是小于除数,那么当前数就直接作为余数乘以10了。
for(int j=0;j<la;j++) //被除数从左向右依次被除
{
if(a[j]-'0'+t>=i) //当前位数够除时
{
t=((a[j]-'0'+t)%i)*10; //除法处理,余数t等于当前位数加上上一个余数除以除数然后乘以10
}
else //当前位数不够除时
{
t=(a[j]-'0')*10; //余数直接等于当前数乘以10
}
}