主题:求助:C语言小程序问题
keaaron
[专家分:0] 发布于 2010-03-29 08:49:00
例题:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程序找出1000之内的所有完数,并按下面格式输出其因子:
6 its factors are 1、2、3
我编写的程序如下:
#include<stdio.h>
void main()
{int x,t=0,i; clrscr();
for(x=1;x<=1000;x++)
for(i=1;i<=x;i++)
if(x%i==0)
t+=i;
if(x==t)
printf("%d has factors",x);
else printf("%d hasn't factors",x);
这个我运行后输出结果不对;找不出原因;
说明:1、我在最后没有将每个因子输出,只输出了该完数;
2、多谢各位的解答。若方便的话请留下QQ,不懂的地方希望能向你请教;
回复列表 (共10个回复)
沙发
rtygbwwwerr [专家分:910] 发布于 2010-03-29 09:19:00
楼主这段代码错误太多,以下标颜色的地方都有错:
void main()
{
[color=FF0000]int x,t=0,i; //t的定义应该放在第一层for循环中,放在最外部会造成上次循环累加结果影响下次循环的累加计算[/color]
clrscr();
[color=FF0000]for(x=1;x<=1000;x++)//最外层for应该加上大括号,否则会导致
if(x==t)以下的语句只能执行一次[/color]
[color=FF0000]for(i=1;i<=x;i++)//根据题目要求,该数自身应该不作为因数计算所以这里的i<=x应改为i< x[/color]
if(x%i==0)
t+=i;
if(x==t)
printf("%d has factors",x);
else printf("%d hasn't factors",x);
板凳
rtygbwwwerr [专家分:910] 发布于 2010-03-29 09:20:00
以下是修改后的代码:
int x,i;
//clrscr();
for(x=1;x <= 1000;x++)
{
int t=0;
for(i=1;i < x;i++)
{
if(x % i==0)
{
t+=i;
}
}
if(x==t)
{
printf("%d has factors\n",x);
}
else
{
printf("%d hasn't factors\n",x);
}
}
3 楼
rtygbwwwerr [专家分:910] 发布于 2010-03-29 14:18:00
另外,第二层循环可改为:
int max = x/2;
for(i=1;i < max;i++)
这样可以少做一些不必要的循环,提高效率
4 楼
雪光风剑 [专家分:27190] 发布于 2010-03-30 07:39:00
[quote]另外,第二层循环可改为:
int max = x/2;
for(i=1;i < max;i++)
这样可以少做一些不必要的循环,提高效率
[/quote]
更优化的解决方式是,
判断该数是否是平方数
是的话先加上其平方根
取其平方根的整数部分
从1循环到这个整数部分
如果能整除
目标变量同时加上这个数及原值除以这个变量的商
5 楼
雪光风剑 [专家分:27190] 发布于 2010-03-30 07:40:00
如果想输出每个因子,还需要开个数组来保存这些因子,复杂度小增
6 楼
rtygbwwwerr [专家分:910] 发布于 2010-03-30 10:41:00
雪光兄的话我不是很明白,
假设这里x = 16,按雪光兄的思路是不是应该这样:
判断该数是否是平方数 => yes
是的话先加上其平方根 => 16 + 4 = 20
取其平方根的整数部分 => 取sqrt(20) = 4 => max = 4
从1循环到这个整数部分 => for(i=1;i < max;i++)
如果能整除 => 1,2,3,4(均可整除)
目标变量同时加上这个数及原值除以这个变量的商 => ?(what's mean?)
7 楼
cxxcomp [专家分:2370] 发布于 2010-03-30 17:31:00
[quote]雪光兄的话我不是很明白,
假设这里x = 16,按雪光兄的思路是不是应该这样:
判断该数是否是平方数 => yes
是的话先加上其平方根 => 16 + 4 = 20
取其平方根的整数部分 => 取sqrt(20) = 4 => max = 4
从1循环到这个整数部分 => for(i=1;i < max;i++)
如果能整除 => 1,2,3,4(均可整除)
目标变量同时加上这个数及原值除以这个变量的商 => ?(what's mean?)
[/quote]
雪光风剑的意思是,需要一个数组以保存每次得到的因子。好似这才符合题目的意思。因为它要求如果是完美数(perfect number)的话,才打印因子。所以需要保存。
换个说法,需要一个容器啦。另外,你的做法可以求出质因数,但对于完美数而言,数论中要求好似不一定是质因数,是因数即可。
我也凑个热闹,给出一个使用STL的代码计算1--10000的完美数。
[code=c]
/********************************************************************
created: 2010/03/30
created: 30:3:2010 17:20
filename: main.cpp
file path: ..\pfan_tst28
file base: main
file ext: cpp
author: adam email:244069717@qq.com
purpose: exercise && play
*********************************************************************/
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
typedef vector<int> VEC_INT;
typedef VEC_INT::iterator INT_ITER;
typedef ostream_iterator<int> OUT_ITER;
typedef
struct TINTx
{
friend void ToJudgePerf(TINTx tix);
friend ostream& operator<< (ostream&, TINTx&);
TINTx(int num)
: _value(num)
{
for (int ix = 1; ix < num; ++ix)
{
if (num % ix == 0)
{
_factors.push_back(ix);
}
}
int nSum = 0;
for (INT_ITER it = _factors.begin(); it != _factors.end(); ++it)
{
nSum += *it;
}
_factors.push_back(nSum);
}
private:
TINTx() {};
int _value;
VEC_INT _factors;
};
inline
ostream& operator<< (ostream& os, TINTx& tix)
{
os << tix._value << " its factors are ";
copy(tix._factors.begin(), tix._factors.end()-1, OUT_ITER(os, " "));
os << std::endl;
return os;
}
void ToJudgePerf(TINTx tix)
{
if (tix._factors.back() == tix._value)
{
std::cout << tix << std::endl;
}
}
typedef vector<TINTx> VEC_TINTx;
int main(int, char **, char **)
{
const int maxnum = 10000;
VEC_TINTx buffer;
for (int ix = 1; ix <= maxnum; ++ix)
{
TINTx xValue(ix);
buffer.push_back(xValue);
}
for_each(buffer.begin(), buffer.end(), ToJudgePerf);
}
[/code]
8 楼
cxxcomp [专家分:2370] 发布于 2010-03-30 17:35:00
好似结果显示,1--10000内的perfect number(完美数)确实不是很多。物以稀为贵啊。
[img]http://blog.pfan.cn/upfile/201003/20100330173312.jpg[/img]
9 楼
sxm227 [专家分:10] 发布于 2010-03-31 09:10:00
深圳市华信群英科技有限公司与知名通信软件公司正式签订定向输送人才的合作协议
针对想进入IT软件行业的有志人士提供专业的企业内训
实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段
实训前就签订就业安置协议,岗前实训后入职
不仅学费优惠而且是企业定向培训定向招聘,百分百保证就业
有意向请登录www.szctt.com,或加QQ:1179397962做详细咨询
10 楼
dinghao517 [专家分:20] 发布于 2010-03-31 20:47:00
#include <iostream>
using namespace std;
int main()
{
for(int x=1;x<1000;x++)
{
int a[10],j(0);
for(;x!=1;)
{
for(int i=2;i<x;i++)
{
if(x%i==0)
{
x=x/i;
a[j]=i;
j++;
break;
}
}
}
int sum(0);
for(int k=0;k<j;k++)
sum=sum+a[k];
if(x==(sum+1))
cout<<x<<" ";
}
return 0;
}
我来回复