题解 | #大整数的因子#

大整数的因子

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")

全部评论

相关推荐

ddd7_:跟我一模一样,加微信的hr都同一个,扫码了白年书人查看图片
点赞 评论 收藏
分享
行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务