2=2
3=3
4=2*2
....
99=3*3*11
100=2*2*5*5;
且告诉我每一步的意思
free pascal编程求2-100中每个数的质因子.
答案:2 悬赏:80 手机版
解决时间 2021-03-20 10:09
- 提问者网友:棒棒糖
- 2021-03-19 19:43
最佳答案
- 五星知识达人网友:山河有幸埋战骨
- 2021-03-19 19:52
这个简单。思路就是:一个大循环,i := 2 to 100 对每个数i作质数分解。 所以关键是对某个整数作分解。 以99这个数为例说明,除数先从最小的质数2开始,99不能被2整数,除数+1 = 3; 99可以被3整除,记录这个质数3, 然后99÷3=33后继续被3整数,又的得11,再次记录质数3; 这时11不能被3整数了,不用记录3, 那么除数+1=4; 11不能被4整除,继续除数+1=5,。。。,直到11,可以整除,记录11,剩余的数是1,过程结束。注意:结束的条件有两个,一是剩余的数=1;二是这个除数+1的过程直到除数>99 div 2 = 44为止,这是因为假设n = a·b成立,a的最小质数取值范围是2,那么b的最大取值范围≤n÷2,因此超过范围的b取值,无意义,只是增加循环的次数而已。
代码如下:
...
var
i : integer;
begin
// 求2~100的每个数的因子
for i := 2 to 100 do
Writeln (IntToStr(i) + '=' + factorDecomp (i)); //调用因子分解函数,按格式输出。
end;
...
function factorDecomp(const num : Integer) : String;
var
sDF : String;
nRest : Integer;
nDivisor : Integer;
begin
nDivisor := 2; //除数从2开始
nRest := num; // num是需要分解的整数
sDF := ''; //sDF是记录质数因子的字符串,格式: 2*2*5*5
repeat // 除数从2开始的循环
while (nRest mod nDivisor = 0) do
begin
// 记录发现的因子。 如果是第1个发现的,直接记录;否则按*n这种方式记录。
if length(sDF) = 0 then
sDF := IntToStr(nDivisor)
else
sDF := sDF + '*' + intToStr(nDivisor);
nRest := nRest div nDivisor; // 把分解剩下的数赋值给nRest,继续同一个因子的分解
end;
inc (nDivisor); //除数+1, 继续分解。
until (nRest = 1) or (nDivisor > num div 2); //结束条件,余下的数=1或除数超过num的一半
if length(sDF) = 0 then //如果没有输出,那么该数无法分解,记录该数即可
sDF := IntToStr(num);
Result := sDF; //返回最后的结果,格式: n或者n1*n2*n3...
end;
代码如下:
...
var
i : integer;
begin
// 求2~100的每个数的因子
for i := 2 to 100 do
Writeln (IntToStr(i) + '=' + factorDecomp (i)); //调用因子分解函数,按格式输出。
end;
...
function factorDecomp(const num : Integer) : String;
var
sDF : String;
nRest : Integer;
nDivisor : Integer;
begin
nDivisor := 2; //除数从2开始
nRest := num; // num是需要分解的整数
sDF := ''; //sDF是记录质数因子的字符串,格式: 2*2*5*5
repeat // 除数从2开始的循环
while (nRest mod nDivisor = 0) do
begin
// 记录发现的因子。 如果是第1个发现的,直接记录;否则按*n这种方式记录。
if length(sDF) = 0 then
sDF := IntToStr(nDivisor)
else
sDF := sDF + '*' + intToStr(nDivisor);
nRest := nRest div nDivisor; // 把分解剩下的数赋值给nRest,继续同一个因子的分解
end;
inc (nDivisor); //除数+1, 继续分解。
until (nRest = 1) or (nDivisor > num div 2); //结束条件,余下的数=1或除数超过num的一半
if length(sDF) = 0 then //如果没有输出,那么该数无法分解,记录该数即可
sDF := IntToStr(num);
Result := sDF; //返回最后的结果,格式: n或者n1*n2*n3...
end;
全部回答
- 1楼网友:枭雄戏美人
- 2021-03-19 20:04
我也是学pascal 在学校有老师教 学习主要目的就是参加noip比赛 建议你学这本书 这本书还是比较全面,自学的话也比较合适,当然有老师教更好
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯