c语言改错,输入100000 200000,输出结果为什么有一个是负数?程序及结果如下。

 我来答
百度网友6fe74e2
2013-12-16 · TA获得超过6595个赞
知道大有可为答主
回答量:1973
采纳率:100%
帮助的人:343万
展开全部

原因很简单,就是数据超界了,

ji=m*n;

m和n一个是100000,一个是200000

long int已经表示下他们的乘积ji了

因为在vc6.0中long int也是只占32 的

所以你不能以这种方式来求两个很大的数的最小公倍数

推荐你用循环的方式来做

#include "stdio.h"
int main()
{
   int m,n,i,tmp;
   scanf("%d%d",&m,&n);
   tmp=m;
   if(m<n)
     tmp=n;
   for(i=tmp;;i++)
   {
     if(i%m==0 && i%n==0)
     //找到两个数中较大的数开始的第一个能整除m,n的数,就是最小公倍数
     {
        printf("%d和%d的最小公倍数为%d\n",m,n,i);
        break;
     }
   }  
}
追问
怎么改?
追答

来循环来做

#include "stdio.h"
int main()
{
  int m,n,i,tmp;
  scanf("%d%d",&m,&n);
  tmp=m;
  if(tmp<n)
    tmp=n;//tmp存m,n其中较大的数
  for(i=tmp;;i++)
  {
    if(i%m==0 && i%n==0)
    //从m,n中较大的数开始的第一个能整除m,n的数肯定就是最小公倍数
    {
      printf("%d和%d的最小公倍数为:%d\n",m,n,i);
      break;
    }
  } 
  tmp=m;
  if(tmp>n)
    tmp=n;
  for(i=tmp;i>0;i--)
  {
     if(m%i==0 && n%i==0)
     {
         printf("%d和%d的最大公约数为:%d\n",m,n,i);
         break;
     }
  }   
}

renshijie1018
2013-12-16 · TA获得超过1006个赞
知道小有建树答主
回答量:1063
采纳率:94%
帮助的人:998万
展开全部
ji=1000000*200000=2*10^10,数据溢出,存的时候变成负数,
所以bei=ji/n 为负数
更多追问追答
追问
怎么改?
追答
一种是直接加大范围
用__int64 a;
scanf("%I64d", &a);用64位的整数做。
或者是用处理大数的方法做
用字符数组存大数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
godinu
2013-12-16 · 超过43用户采纳过TA的回答
知道小有建树答主
回答量:111
采纳率:0%
帮助的人:108万
展开全部
类型定义成unsigned long就是正数了
你输入的数字太大,溢出了
追问

把long int改成了unsigned long int结果就成这样了,这怎么破?

追答
数字太大,详情看超大数字乘法的做法,用数组代替数字
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式