大整数因子 c++

时间:2020-12-14 04:22:02

题目描述

已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k.

输入输出

输入描述:

若干个非负整数c,c的位数<=30
每行一个c

输出描述:

每一个c的结果占一行
1) 若存在满足 c%k == 0 的k,输出所有这样的k,中间用空格隔开,最后一个k后面没有空格。
2) 若没有这样的k则输出”none”

注意整数溢出问题
不要对-1进行计算

分析

大整数除法的简单版,没法直接取模,就模拟除法的过程。从第一位开始,余数*10与下一位结合。不知道为什么用之前大整数二进制的方法有一个样例过不了,应该是3,9我只输出了9.于是换了中思路简单的取模*10+下一位,过
注意这里最后一个是不能输出 多余空格的

代码

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<cctype>
#include<cmath>

using namespace std;
vector<int>v;
int main()
{
    int  k;
    string c;
    while (cin>>c)
    {
        v.clear();
        string h = c;
        int len = c.length();
        bool flag = false;
        for (int k = 2; k <= 9; k++)
        {
            c = h;
                len = c.length();
                int cur = 0;
                for (int i = 0; i < len; i++)
                {
                    cur = cur * 10 + c[i] - '0';
                    cur = cur % k;
                    if (i == len - 1 && cur == 0) { v.push_back(k); 
                    flag = true; }
                }
        }
        if (flag == false)printf("none");
        else {
            int si = v.size();
            for (int i = 0; i < si - 1; i++)
                printf("%d ", v[i]);
            printf("%d", v[si - 1]);
        }
        printf("\n");
    }
}