数字和

分析问题

  1. 判断合数:检查一个数是否为合数。合数是指除了1和它本身之外还有其他因数的数。
  2. 计算各位数字之和:对于一个数,将其各位数字相加得到和。
  3. 分解质因数并求和:将合数分解为质因数,然后计算这些质因数的各位数字之和。
  4. 输出结果:将符合条件的数按每行5个的格式输出。

建立模型

主过程:
    输入 n
    初始化 line 为 1

    对于 i 从 4 到 n 循环执行:
        设置 f 为 false

        对于 j 从 2 到 sqrt(i) 循环执行:
            如果 i 能被 j 整除:
                设置 f 为 true
                跳出内层循环

        如果 f 为 true(即 i 是合数):
            初始化 sum1 为 0
            将 i 的值赋给 tmp

            当 tmp 大于 0 时循环执行:
                将 tmp 的最后一位数字加到 sum1 上
                去掉 tmp 的最后一位数字

            初始化 sum2 为 0,将 i 的值再次赋给 tmp,初始化 k 为 2

            当 tmp 不等于 1 时循环执行:
                当 tmp 能被 k 整除时循环执行:
                    如果 k 小于 10:
                        将 k 加到 sum2 上
                    否则:
                        初始化 l 为 k
                        当 l 大于 0 时循环执行:
                            将 l 的最后一位数字加到 sum2 上
                            去掉 l 的最后一位数字
                    将 tmp 除以 k(去除质因数)
                k 自增

            如果 sum1 等于 sum2:
                输出 i 和一个空格
                line 自增

            如果 line 能被 6 整除:
                输出换行符
                重置 line 为 1

    结束程序

编写代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,sum1,sum2,tmp,tmpz,line=1;
    cin>>n;
    bool f;
    for(int i=4;i<=n;i++){  //循环了n次              
        f=false;
        //查找有没有因子,有质子直接跳出 
        for(int j=2;j*j<=i;j++){ //循环了n*根号n次 
            if(i%j==0){
                f=true;//是合数 
                break;
            }
        } 
        if(f) {
            sum1=0; //统计各数位和
            tmp=i;
            while(tmp){
                sum1+=tmp%10;
                tmp/=10;
            }

            //2 求质因子的和 
            tmp=i;//这里tmp变量重复使用 
            sum2=0;//统计质因数和,记得统计数先做归零操作 
            int k=2;
            while(tmp!=1){
                while(tmp%k==0){
                    if(k<10){//个位数的质因数
                        sum2+=k;
                    }else{//两位以上,将各数位累加
                        int l=k;
                        while(l){//次数很少,忽略不计
                            sum2+=l%10;
                            l/=10; //这一步很重要 
                        }
                    }
                    tmp/=k;//除去质因数
                }
                k++;
            }
             if(sum1==sum2){
                cout<<i<<" ";
                line++;
             }          
            }//合数结束 
          if(line%6==0) {
                cout<<"\n";
                line=1;
          }  
    }//循环结束 
    return 0;
}

保存 编译 运行