循环

46 阅读3分钟

c语言方面错题每日记录。

一.qwl实验2

7-3 最大公约数(GCD)和最小公倍数(LCM)

光求最大公约数有三种方法(乘积product):

第一种

#include<stdio.h>
int main()
{
    int n,m;
    int a,b;
    scanf("%d %d",&n,&m);
    if (m>n)
        a=m;
    else
        a=n;
    for (b=a;b>=0;b--)
    {
        if (m%b==0&&n%b==0)
        {
            printf("%d",b);
            break;
        }
    }
}

第二种

#include<stdio.h>
int main()
{
    int m,n;
    int num=0;
    scanf("%d %d",&m,&n);
    while((m%n)!=0)
    {
        num=m%n;
        m=n;
        n=num;
    }
    printf("%d",num);
}

第三种

#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    while (m!=n)
    {
        if (m>n)
        {
            m=m-n;
        }
        else
        {
            n=n-m;
        }
    }
    printf("%d",n);
}//众所周知,m=n时才是最大公约数。其实也可以用

第四种

#include<stdio.h>
int main()
{
    int m=511,n=292;
    int i,product=1;
    for (i=2;i<=292;)
    {
        if (m%i==0&&n%i==0)
        {
		
            m=m/i;
            n=n/i;
            product=product*i;
            if (m%i==0&&n%i==0)
            i=i;
            else
            i=i+1;
        }
        else
            i=i+1;
    }
    printf("%d",product);
}//这种是我自己写的,根据的数学知识是连除法,-_-

最小公倍数就最大公约数的延申,连除法。(说不清,看方程吧)(由于是输入输出,前面根据题目和第四种方法进行改正)

#include<stdio.h>
int main()
{
    int m,n,p,q;
    int i,GCD=1,LCM;
    scanf("%d %d",&m,&n);
    if (m>=n)
    {
        p=m;
        q=n;
    }
    else
    {
        p=n;
        q=m;
    }
    for (i=2;i<=q;)
    {
        if (p%i==0&&q%i==0)
        {
		
            p=p/i;
            q=q/i;
            GCD=GCD*i;
            if (p%i==0&&q%i==0)
            i=i;
            else
            i=i+1;
        }
        else
            i=i+1;
    }
    printf("%d ",GCD);
    LCM=m/GCD*n;
    printf("%d",LCM);
}\\主要看最后两行

7-6 输出闰年

第一条是我的方法,不好,21世纪的你这样做,你算出来了,22世纪你也要自己算吗?(让计算机去实现功能,而不是为了做题而输出结果('-_-'))

#include<stdio.h>
int main()
{
    int a,i;
    scanf("%d",&a);
    if (a<2000||a>=2100)
        printf("Invalid year!");
    else if(a<2004)
        printf("None");
    else 
    for (i=2004;i<=a;i++)
    {
        if (i%4==0&&i%100!=0||i%400==0)
            printf("%d\n",i);
        else
            continue;
    }
}

这是我改了一遍后(目前还是有问题)(问题就是else后面加大括号)

#include<stdio.h>
#include<math.h>
int main()
{
    int a,i,sum=0;
    scanf("%d",&a);
    if (a<2000||a>2100)
        printf("Invalid year!");
    else 
    for (i=2001;i<=a;i++)
    {
        if (i%4==0&&i%100!=0||i%400==0)
            {
			printf("%d\n",i);
            sum++;
        }

    }
            if (sum==0)
           { printf("None");}
}

满分答案

int main()
{
  int n;
  scanf("%d",&n);
  if(n>=2001&&n<=2100)
  {
    int temp=0;
    int i;
    for(i=2001;i<=n;i++)
    {
      if((i%4==0&&i%100!=0)||i%400==0)
      {printf("%d\n",i);temp++;}
    }
    if(temp==0) printf("None\n");
  }
  else
  printf("Invalid year!\n");
  return 0;
}

一个老是出毛病的程序(没考虑n==0的情况)

int main()
{
	float sum=0,grade,average;
    int count=0,i,n;
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%f",&grade);
        sum=sum+grade;
        if (grade>=60)
            count++;
        else
            continue;
    }
    printf("average = %.1f\n",sum/n);
    printf("count = %d",count);
}

二.调试

1.如何调试?

设断点-编译-调试-添加查看-下一步。

2.调试遇到的问题?

项目没有调试信息,让你打开项目调试选项并重新生成? 工具-编译选项-代码生成与优化-连接器-产生调试信息。

三.累乘出现问题?

最后一个字母i变p(智障吧你),调试时分清你要添加查看的变量。

int main()
{
	int i;
	int p=1;
	for(i=1;i<=6;i++)
	{
		p=p*i;
	}
	printf("%d",i);
}