题解 | #大整数的因子#

大整数的因子

https://www.nowcoder.com/practice/3d6cee12fbf54ea99bb165cbaba5823d

#include <iostream>
#include <iterator>
#include <bits/stdc++.h>
using namespace std;

struct bign {
    int nums[3001];
    int lens;
    bign() {
        memset(nums, 0, sizeof(nums));
        lens = 0;
    }
};

bign multiply(bign a, bign b) {
    bign res;
    int length;
    for (int i = 0; i < a.lens; i++) {
        int carry = 0;
        length = i;
        for (int j = 0; j < b.lens; j++) {
            int current = a.nums[i] * b.nums[j] + carry;
            int jinwei = res.nums[length] + current;
            res.nums[length++] = jinwei % 10;
            carry = jinwei / 10;
        }
        if (carry) res.nums[length++] += carry;
    }
    res.lens = length;
    return res;

}

bign int2big(int num) {
    bign res;
    while (num > 0) {
        int t = num % 10;
        res.nums[res.lens++] = t;
        num /= 10;
    }
    return res;
}
bign str2big(string str){
    bign res;
    res.lens = str.size();
    for(int i = res.lens - 1; i >= 0; i--){
        res.nums[i] = str[res.lens - i - 1] - '0'; //切记 字符串转换big 要减去 ‘0’
    }
    return res;
}


bign jiecheng(int n) {
    bign ans = int2big(n);
    if (n == 1) return ans;
    return multiply(ans, jiecheng(n - 1));
}

bign divide(bign a, int b, int &remainder){ //big 除法 r用做余数
      bign res;
      res.lens = a.lens;
      remainder = 0;
      for(int i = a.lens - 1; i >= 0; i--){
        int current = a.nums[i] + remainder * 10; //当前位 加上上一位余位
        res.nums[i] = current / b; //本位可以先为0 后面会处理
        remainder = current % b; //余数计算更新
        // if(current % b== 0) {
        //     res.nums[i] = a.nums[i] / b;
        // }else{
        //     if(i != a.lens - 1 || current / b != 0){
        //         res.nums[i] = a.nums[i] / b;
        //         remainder = current % b;
        //     }
        // }
      }
      while(res.nums[res.lens - 1] == 0 && res.lens > 1) res.lens--; //更新res长度 从末尾遍历 如果为0则减一 但是如果只有一位时 就保留为0
      return res;

}




int main() {
    string n;
    while (cin >> n) {
        if(n == "-1") {
            break;
        }
        bign num = str2big(n);
        int count = 0;
        for(int k = 2; k <= 9; k++){
             int r;
             divide(num, k,r);
             if( r == 0) {
               cout << k << " ";
               count++;
             }
        }
        if(count == 0) cout << "none";
        cout << endl;
       

    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务