当前位置: 首页 > 工具软件 > kLoop > 使用案例 >

LOOP——循环结构

阎作人
2023-12-01

对于遵循一定规律的重复计算操作,again and again,人类疲倦不堪,可计算机却“乐此不疲”。从某种意义上来说,循环的基本语法结构(初始化、循环条件、重复语句、为下一次重复做的准备和变化)并不难掌握,难的是如何分析,并把这种特定的规律传达给计算机。下面根据问题的分类,给出相应的代码以供参考。

  1. 特征数字——穷举

example1.1: 求a, b(a<b)的最大公约数

#include <stdio.h>

int main()
{
        int a,b,i,com_divisor;
		scanf("%d%d",&a,&b);
		for(i=1;i<=b;++i)
		{
			if(a%i==0&&b%i==0)
				com_divisor=i;	
		}
		printf("%d,%d的最大公约数为%d\n",a,b,com_divisor);
        return 0;
}
}

example1.2: 判断是否为“完数”

#include <stdio.h>

int main()
{
        int n,divisor,s;
		scanf("%d",&n);
		for(divisor=1,s=0;divisor<n;divisor++)
		{
			if(n%divisor==0)
			{
				s=s+divisor;
			}
		}
		if(s==n) printf("yes\n");
		else printf("no\n");
		return 0;
} 

example1.3: 判断是否为素数

#include<stdio.h>
#include<math.h>

main()
{
	long long i,num;
	_Bool flag=1;
	
	printf("请输入大于1的整数:"); 
	scanf("%lld",&num);
	
	for(i=2;i<=sqrt(num);++i){
		if(num%i==0) 
		{
			flag=0;
			//break;
		}
	} 
	if(flag) printf("%lld是素数\n",num);
	else printf("%lld不是素数\n",num);
}

example1.4: 输出10个"韩信点兵数"

#include <stdio.h>

int main()
{
        int n,t;
		for(n=0,t=0;t<10;++n)
		{
			if(n%3==2&&n%5==3&&n%7==4)
			{
				if(t<9)
				printf("%d ",n);
				else if(t=9)
				printf("%d\n",n);
				t+=1;
			}
		}
        return 0;
} 

example1.5: 输出1~999中能被3整除且至少有一位数字是5的所有整数

#include <stdio.h>

int main()
{
        int n,d1,d10,d100,t;
		for(n=1,t=0;n<=999;n++)
		{
			d100=n/100;
			d10=n/10%10;
			d1=n%10;
			if(n%3==0&&(d1==5||d10==5||d100==5))
				{
					printf("%-4d",n);
					t++;
					if(t%5==0)
						printf("\n");
				}
		}
        printf("\n");
		return 0;
} 

example1.6: 判断回文数(正整数的逆转)

#include <stdio.h>

int main()
{
    int n,s,m;
    scanf("%d",&n);
    m=n;
    s=0;
    while(n)
    {
        s=s*10+n%10;
        n=n/10;
    }
    if(s==m) printf("yes\n");
    else printf("no\n");

    return 0;
}

  1. 规律运算——迭代

example2.1: 斐波拉契数列(其一)

n1234567
1a
1ba’
2b’a’’
3b’’a’’’
5b’’’a’’’’
8b’’’’a’’’’’
13b’’’’’a’’’’’’
21b’’’’’’
#include <stdio.h>

int main()
{
        int a=1,b=1,n,i,t;
		scanf("%d",&n);
		for(i=1;i<n;++i)
		{
			t=a;
			a=b;
			b+=t;
		}
		printf("斐波拉契数列的第%d项为%d\n",n,a);
        return 0;
}

example2.2: (不断)分解因式

# include <stdio.h>

int main()
{
	int x,n;
	scanf("%d",&n);
	printf("%d=",n);
	
	x=2;
	while(n>1)
	{
		if(n%x==0)
		{
			if(n==x) printf("%d\n",x);
			else	  printf("%d*",x);
			n=n/x;
		}
		else
		x++;
	 } 
	return 0;
}

example2.3: 正整数的逆转(其二)

#include <stdio.h>

int main()
{
    int n,x;
    scanf("%d",&n);
    x=n;
    while(n)
    {
        printf("%d",n%10);
        n=n/10;
    }
    return 0;
}

example2.4: 累加与阶乘

#include <stdio.h>

int main()
{
        int n,i=1,sum=0,product=1;
		scanf("%d",&n);
	
		while(i<=n)
		{
			sum=sum+i;
			product=product*i;
			i=i+1;
		}
		printf("1+...+%d=%d\n",n,sum);
		printf("1*...*%d=%d\n",n,product);
		return 0;
} 

example2.5: 杨辉三角(其一)

#include <stdio.h>
#include <math.h>

int factorial (int n); 

int main()
{
	int n,i,j,x;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i;j++)
		{
			x=factorial(i-1)/(factorial(j-1)*factorial(i-j));
			if(i==j) printf("%d",x);
			else printf("%d ",x); 
		}
		printf("\n");
	}
	return 0;
} 

int factorial(int n)
{
	int i,product;
	for(i=1,product=1;i<=n;i++)
	{
		product=product*i;
	}
	return product;
} 
  1. 符号图案——格式

example3.1: 九九乘法表(标准、右下)

#include <stdio.h>
#include <math.h>

int main()
{
	int i,j;
	for(i=1;i<=9;i++)
	{
		for(j=1;j<=i;j++)
		{
			printf("%d*%d=%-4d",i,j,i*j);
		}
		printf("\n");
	}
	return 0;
} 

#include <stdio.h>

int main()
{
        int i,j,k;

        for (i=1;i<=9;i++)
        {
                for (k=1;k<=9-i;k++)
                {
                    printf("        ");
                }

                for (j=1;j<=i;j++)
                {
                    printf("%d*%d=%-2d  ",i,j,i*j);
                }
                putchar('\n');
        }

        return 0;
}

example3.2: 杨辉三角(其二)

#include<stdio.h>

int main()
{
	int i,j,n,k,a,b,c,t;
	while(scanf("%d",&n)!=EOF)
	{
	for(i=0;i<n;i++)
	{
		for(j=1;j<=2*(n-i-1);j++) printf(" ");
		
		for(j=0;j<i;j++)
		{
			a=1;
			for(k=1;k<=i;k++) a=a*k;
			b=1;
			for(k=1;k<=j;k++) b=b*k;
			c=1;
			for(k=1;k<=i-j;k++) c=c*k;
			
			t=a/b/c;
			printf("%3d ",t);	
		}
		printf("%3d\n",1);
	}
printf("\n");
}
	return 0;
}

example3.3: 输出第m-1个素数到第n+1个素数之间的所有素数,每10个换一次行

#include<stdio.h>
#include<math.h>

_Bool check(long num);

main()
{
	long count=0,prime[10000],left,right,i,j,k,time;
	for(i=2;i<=10000;i++)
	{
		if(check(i))
		{
			count+=1;
			prime[count]=i;
		}
	}
	
	while(scanf("%ld%ld",&left,&right)!=EOF)
	{
		getchar();
		for(k=left,time=1;k<=right;k++,time++)
		{
			if(time%10==0||time==right-left+1)
				printf("%ld\n",prime[k]);
			else
				printf("%ld ",prime[k]);
		}
	}
	
}

_Bool check(long num)
{
	long i;
	_Bool flag=1;
	for(i=2;i<=sqrt(num);i++)
	{
		if(num%i==0)
		{
			flag=0;
			break;
		}
	}
	return flag;
}

example3.4: 变种水仙花数(例如:1461 = 1461 + 1461 + 146*1)

#include<stdio.h>

int main()
{
	int l,r,count,i,j,ll,rr,s;
	while(scanf("%d%d",&l,&r)!=EOF)
	{
		count=0;
		for(i=l;i<=r;i++)
		{
			s=0;
			
			for(j=10;j<=10000;j*=10)
			{
				ll=i/j;
				rr=i%j;
				s=s+ll*rr;
			}
			
			if(s==i)
			{
				count++;
				if(count%5==0) 
					printf(" %d\n",i);				
				else if(count%5==1) 
					printf("%d",i);
				else 
					printf(" %d",i);
			}
			
		}
		
		if(count==0) printf("not exist\n");
		if(count%5!=0)printf("\n");
	}
	return 0;
} 

example3.5: 圣诞树

int christmas(int n,int a[10],int b[10],int c[10],int x,int y)
{
	int i,j,k,m;
	m=y; 
	for(i=0;i<n;i++)
	{
		if(a[i]+b[i]*(c[i]-1)>m)
		m=a[i]+b[i]*(c[i]-1);
	}
	for(i=0;i<n;i++)//绘制n个矩阵 
	{
		for(j=1;j<=c[i];j++)//绘制单个矩阵
		{
			for(k=1;k<=m/2-a[i]/2-(j-1)*b[i]/2;k++)//输出空格 
			{
				printf(" ");
			}
			for(k=1;k<=a[i]+b[i]*(j-1);k++)//输出*
			{
				printf("*"); 
			}
			printf("\n") ;
		}
	}
	for(i=1;i<=x;i++)//输出下方矩形
	{
		for(j=1;j<=m/2-y/2;j++)//输出空格 
		{
			printf(" ");
		}
		for(j=1;j<=y;j++)//输出*
		{
			printf("*"); 
		}
		printf("\n");
	} 
	
}
 类似资料: