1171:大整数的因子

时间限制: 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
            }
        }

猜你喜欢

转载自blog.csdn.net/ice___snow/article/details/81586086