| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 909 人关注过本帖
标题:新手求问,更相减损术,死循环
只看楼主 加入收藏
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
新手求问,更相减损术,死循环
程序代码:
#include <stdio.h>
#include <math.h>

void main()
{
    int a,b,t=0,i=0;
    printf("请输入两个整数,以英文逗号相隔\n");
    scanf("%d,%d",&a,&b);
    while ((a%2==0) && (b%2==0))
    {
        a = a/2;
        b = b/2;
        i = i+1;
        printf("%d,%d,%d\n",a,b,i);
    }
    while (a!=b)
    {
        if (b>a)
        {
        t = a;
        a = b;
        b = t;
        }
        a = a - b;
        printf("%d,%d,%d\n",a,b,t);
    }
    a = a * pow(2,i);
    printf("最大公约数为 %d\n",a);
}
求解为什么当我两个都输入偶数的时候就会陷入死循环,printf也只执行一次...
另外在好奇一下为什么t不赋初值那a!=b的循环里第一次的t会是一个很大的数(每次一样),没赋值在内存里面是怎么样的?

另外chenwei435大大的那个代码我也看过int gy里最后一行return temp;是什么意思 另外这个是不是一旦gy被使用就会执行int gy里面的程序段...我是新手,在C程序设计里面也看过一个return的 貌似是比较大小的示例程序...
程序代码:
#include<stdio.h>
int gy(int x,int y)
{
    int temp;
    while(1)
    {
        temp=x-y;
        if(y==temp)
        {
            break;  /*如果减数和差相等就跳出循环*/ 

        }
        if(temp>y)
        {
            x=temp;
        }
        else
        {
            x=y;
            y=temp;
        }
    }
    return temp;
}
void main()
{
    int a,b,t;
    printf("请输入两个数:\n");
    scanf("%d,%d",&a,&b);
    if(a>b)
        t=gy(a,b);
    else
        t=gy(b,a);
    printf("最大公约数为:%d\n",t);
}

搜索更多相关主题的帖子: color 
2011-09-09 01:06
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:12 
第一个貌似没有陷入死循环吧,另外没有给t初始化,如果t是全局int型变量,会被自动初始化为0,这里是局部变量,就是一个随机的值,不过VC++6.0一般会将其初始为0cccccccch
return temp;就是一个函数的返回,因为调用一个函数来处理数据,我们要怎么得到想要的结果呢,这时就可以将处理后的结果利用return 语句返会给主调程序。
2011-09-09 01:23
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:5 
求最大公约数最常见的算法是:辗转相除法。
#include  <stdio.h>
int main(void){
    int a , b ;
    int  r,t;                                   
    printf("请输入两个整数:") ;
    scanf("%d%d" , &a , &b) ;
    if(a<b){                                   
        t=a;a=b;b=t;}
    r=a%b;                                   
    while(r!=0){
        a=b ;
        b=r ;
        r=a%b ;   
    }
    printf("最大公约数是:%d\n" , b);
    return 0;
}

结果:
请输入两个整数:56 32
最大公约数是:8

请输入两个整数:45 15
最大公约数是:15

请输入两个整数:27 9
最大公约数是:9

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-09-09 06:28
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:3 
因为输入偶数时,循环语句,永远为真,偶数整除于二,你把一百和八十输入,你除到负的一百万也是能整除

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-09-09 07:11
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:0 
回复 4楼 A13433758072
100和80会除到负的一百万?
每次除2总归是会变成奇数的
2011-09-09 09:44
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
另外先感谢2L大大的详细回答,那return为什么是返回给temp变量 而不是 gy或者 a,b?

应该除2会除到有奇数存在才对的 比如198 除2应该是99吧

另外昨天我睡觉的时候想了一下 又改成这样 却没有死循环... 为什么......第一个程序只会执行一次printf,而且之后就CPU占用满.然后程序就不动了

程序代码:
#include <stdio.h>
#include <math.h>

void main()
{
    int a,b,t=0,i=0;
    printf("请输入两个整数,以英文逗号相隔\n");
    scanf("%d,%d",&a,&b);
    while (1)
    {
        if (a%2==0 && b%2==0)
        {
        a = a/2;
        b = b/2;
        i = i+1;
        printf("%d,%d,%d\n",a,b,i);
        }
        else break;
    }
    while (a!=b)
    {
        if (b>a)
        {
        t = a;
        a = b;
        b = t;
        }
        a = a - b;
        printf("%d,%d,%d\n",a,b,t);
    }
    a = a * pow(2,i);
    printf("最大公约数为 %d\n",a);
}



[ 本帖最后由 随风飘荡 于 2011-9-9 10:32 编辑 ]
2011-09-09 10:20
fedcab123
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:100
注 册:2011-9-3
收藏
得分:0 
借他的这个题问一下,while()语句“括号”里的内容是不满足时则跳出循环对吧??
2011-09-09 11:32
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
我给你摘抄一段书里的

while(表达式)语句
当表达式为非0值时,执行while语句中的内嵌语句,其特点是:先判断表达式,后执行语句。
2011-09-09 11:47
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:0 
return temp; 并不是返回给temp ,而是将函数里的temp的值返回出来,当你用t=gy(a,b)调用gy这个函数的时候,就是用变量t来接受这个返回值。建议你把函数这章好好看看。
至于第一个程序:
程序代码:
 while ((a%2==0) && (b%2==0))
    {
        a = a/2;
        b = b/2;
        i = i+1;
        printf("%d,%d,%d\n",a,b,i);
    }
程序代码:
while (1)
    {
        if (a%2==0 && b%2==0)
        {
        a = a/2;
        b = b/2;
        i = i+1;
        printf("%d,%d,%d\n",a,b,i);
        }
        else break;
    }
这两个表达的意思是一样的,那个程序我用VC++6.0运行过了,没有遇到你说的情况,结果也是正确的。
a,b每次循环都要除以2,所以总是会有一次变为奇数,只要有一个变为奇数,条件(a%2==0 && b%2==0)
就不满足了,也就跳出循环了。
2011-09-09 12:30
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
但是为什么我的会出现CPU占用满和无动作呢?莫非是因为我是WIN7 X64么....再次感谢大大的耐心回答

这个只是我昨天看到最大公约数然后想自己写个程序试试看,我书没翻完,就看到5.3if语句


[ 本帖最后由 随风飘荡 于 2011-9-9 12:48 编辑 ]
2011-09-09 12:44
快速回复:新手求问,更相减损术,死循环
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033978 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved