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

2=23=34=2*2....99=3*3*11100=2*2*5*5;且告诉我每一步的意思... 2=2
3=3
4=2*2
....
99=3*3*11
100=2*2*5*5;
且告诉我每一步的意思
展开
 我来答
splashchaos
推荐于2016-11-09 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3342
采纳率:0%
帮助的人:3682万
展开全部

这个简单。思路就是:一个大循环,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;
更多追问追答
追问
可不可以用简单一点的方法啊
我还没学到那儿啊
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式