永发信息网

free pascal编程求2-100中每个数的质因子.

答案:2  悬赏:80  手机版
解决时间 2021-03-20 10:09
  • 提问者网友:棒棒糖
  • 2021-03-19 19:43
2=2
3=3
4=2*2
....
99=3*3*11
100=2*2*5*5;
且告诉我每一步的意思
最佳答案
  • 五星知识达人网友:山河有幸埋战骨
  • 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;
全部回答
  • 1楼网友:枭雄戏美人
  • 2021-03-19 20:04
我也是学pascal 在学校有老师教 学习主要目的就是参加noip比赛 建议你学这本书 这本书还是比较全面,自学的话也比较合适,当然有老师教更好
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯