网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月30日漏签0天
c++吧 关注:651,279贴子:2,117,886
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 5回复贴,共1页
<<返回c++吧
>0< 加载中...

求大神指教

  • 只看楼主
  • 收藏

  • 回复
  • loggvf
  • =
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
5-1 找完数 (20分)
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数mm和nn之间的所有完数。
输入格式:
输入在一行中给出2个正整数mm和nn(0<m\le n \le 100000<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
输入样例:1 30
输出样例:1 = 1
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
我写的程序是
#include <stdio.h>
int main(){
int m,n,i,j,t=0,flag;
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++){
if(i==1) {t=1;}
if(i%2==0){
for(j=1;j<=i/2;j++){
if(i%j==0) {t+=j;flag=j;}
}
}
else if(i%3==0){
for(j=1;j<=i/3;j++){
if(i%j==0) {t+=j;flag=j;}
}
}
if(t==i){
printf("%d = ",t);
if(t==1) printf("%d\n",t);
for(j=1;j<=i/2;j++){
if(i%j==0&&j!=flag) printf("%d + ",j);
else if(i%j==0&&j==flag) printf("%d\n",j);
}
}
t=0;
}
return 0;
}
我不知道“输出‘None’”以该放在哪里?


  • GTA小鸡
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
直接输出一个None


2026-01-30 04:14:09
广告
不感兴趣
开通SVIP免广告
  • 抬头望那苍穹
  • ==
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
设置一个循环外的bool标识初始化为false,当发现任何一个完全数后设置为true。最后判断这个标志如果为false就输出none。我不是很理解你这个题目,为啥结果会输出1,它应该不是完全数。你这个算法如果范围上十万的话,时间就很长了。我记得完数有两个性质,一是已知完数都是以6和28结尾的,2是都可以表示成连续计数的立方之和。用这两个条件来找,能快很多。还要找因子可以遍历到平方根,不需要到二分之一或三分之一。


  • 抬头望那苍穹
  • ==
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我写了一个,能很快找出int取值范围内的5个完数
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
bool isCompleteNum(int num)
{
if(num % 10 != 6 && num % 100 != 28)
return false;
vector<int> factor;
int sum = 0;
for(int i = 1; i <= sqrt(num); ++i)
{
if(num % i == 0)
{
sum += i;
factor.push_back(i);
if(i != 1 && i != sqrt(num))
{
sum += num / i;
factor.push_back(num / i);
}
}
}
sort(factor.begin(), factor.end());
if(sum == num)
{
cout << num << '=';
for(vector<int>::size_type i = 0; i != factor.size() - 1; ++i)
cout << factor[i] << '+';
cout << factor[factor.size() - 1] << endl;
return true;
}
return false;
}
int main()
{
int m, n;
bool flag = false;
cin >> m >> n;
if(1 == m)
{
cout << "1 = 1" << endl;
flag = true;
}
if(m <= 6 && n >= 6)
{
cout << "6 = 1 + 2 + 3" << endl;
flag = true;
}
int num = 1;
for(int i = 3; ; i += 2)
{
num += pow(i, 3);
if(num > n)
break;
else if (num < m)
continue;
else
{
if(isCompleteNum(num))
flag = true;
}
}
if(!flag)
cout << "None" << endl;
return 0;
}


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 5回复贴,共1页
<<返回c++吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示