分析问题
- 判断合数:检查一个数是否为合数。合数是指除了1和它本身之外还有其他因数的数。
- 计算各位数字之和:对于一个数,将其各位数字相加得到和。
- 分解质因数并求和:将合数分解为质因数,然后计算这些质因数的各位数字之和。
- 输出结果:将符合条件的数按每行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;
}
保存 编译 运行