对于遵循一定规律的重复计算操作,again and again,人类疲倦不堪,可计算机却“乐此不疲”。从某种意义上来说,循环的基本语法结构(初始化、循环条件、重复语句、为下一次重复做的准备和变化)并不难掌握,难的是如何分析,并把这种特定的规律传达给计算机。下面根据问题的分类,给出相应的代码以供参考。
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;
}
example2.1: 斐波拉契数列(其一)
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
1 | a | ||||||
1 | b | a’ | |||||
2 | b’ | a’’ | |||||
3 | b’’ | a’’’ | |||||
5 | b’’’ | a’’’’ | |||||
8 | b’’’’ | a’’’’’ | |||||
13 | b’’’’’ | a’’’’’’ | |||||
21 | b’’’’’’ |
#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;
}
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");
}
}