c语言循环的一些题目

本人是大三学生,希望跨考cs。在这个平台会分享一些自己做的题目,萌新起路,请多多指教。

常见的几个通项公式问题。

​
//计算求和 通项问题
#include <stdio.h>
int main()
{
    double sum;//注意这里要把sum格式改成double形式
    sum=1;
    int n;
    for (n=2 ; n<=1000;n++)
    {
        sum=sum+1.0/n;
        
    }
    
    printf("%lf %d\n",sum,n);
    return 0;
}

//通项求和问题
#include <stdio.h>
int main()
{
    double k;//这里用i来代替k
    int i=1;
    double x;//注意除法用double格式
    for(i=1;i<=100;i++)
    {
        k=k+i;
    }
    for(i=1;i<=50;i++)
    {
        k=k+i*i;
    }
    for(x=1.0;x<=10;x++)
    {
        k=k+1/x;
    }
    printf("%.2lf",k);
    return 0;
}

//计算通项求和
#include <stdio.h>
int main()
{
    double n,t,sum;
     n=1.0;
     sum=1.0;
     t=0.0;
    do
    {
        t=1/(n*(n+1));
        sum=t+sum;
        n++;
    }
    while(t>=0.001);
     printf("%.5lf",sum);
    return 0;
    
}

//依旧是通项构造
#include <stdio.h>
#include <math.h>
int main()
{
    double sinx,x,eps;
    int f,t;
    f=1;
    int n;
    n=0;
    t=1;
    sinx=0;
    double b;
    b=0;
    scanf("%lf lf",&x,&eps);
    while(fabs(b)>=eps)
    {   t=n*(n+1)*t;//重点在于这个阶乘的构造,阶乘都是乘自身,但是这个需要对比多余的量,多出两项可解
        b=f*pow(x,2*n+1)/t;
        sinx=sinx+b;
        f=-f;
        n=n+2;
    }
    printf("%lf",sinx);
    return 0;
}

//提醒注意正负吧
#include <stdio.h>
int main()
{
    int n,i,sum;
    i=0;
    sum=0;
    scanf("%d",&n);
    if(n>=0)
    {
        for(i=n;i<=2*n;i++)
    {
        sum=i+sum;
    }
    }
    else{
        for(i=2*n;i<=n;i++)
        {
            sum=i+sum;
        }
    }
    printf("%d",sum);
    
    return 0;
}


​

这几个通项公式求和问题都比较简单

麦子问题

也是循环的一种直接应用吧,值得注意的是要注意范围,int的范围不够

//麦子问题,提醒你注意范围,利用k作循环次数控制解放i
#include <stdio.h>
int main()
{
    double i,sum,k,j;//注意int的范围
    sum=0;
    i=1;
    for(k=1;k<=64;k++)//循环64次
    {
        sum=i+sum;
       i=2*i;
    }
   j=1.42e8;
   printf("%.2e %.2e",sum,1.0*sum/j);
   return 0;
}

小马中马大马问题,实质就是让你解线性方程组,用if来控制输出就行了,for用来遍历

//整数解问题
#include <stdio.h>
int main()
{
    int a,b,c;
        printf("大马\t中马\t小马\n");
    for(a=0;a<=33;a++)

    
        for(b=0;b<=50;b++)
        {
            c=100-a-b;
            if(c%2==0)//这个我也是用if语句来控制c是2的倍数
          if(  3*a+2*b+c/2==100)//if语句来控制输出,还有注意是==

        printf("%d\t%d\t%d\n ",a,b,c);

        }
    
    return 0;
}

反序数问题大概流程其实大家都清楚,但是反序数这道题的核心思想就是遍历,我一开始设未知数没初始化是行不通的,遍历满足条件的输出就行了,知道利用遍历来做,一个个找就行了

//反序数问题
#include<stdio.h>
int main()
{
	int a,b,c,d,n;
	int sum = 0;
	
	for(n = 1000;n < 1111;n++){
	
		a = n / 1000;
		b = (n % 1000) / 100;
		c = (n % 100) / 10;
		d = n % 10;

	sum = ((1000 * d) + (100 * c) + (10 * b) + a);
		if((9 * n) == sum)		
	printf("%d 的九倍是他的反序:%d\n",n,sum);/*我的那种做法无法解决初始化问题,但是用这种遍历的方法,可以解决,找数利用遍历方式。
    该循环的不是除法和取余,而是遍历1000-9999的循环,而且9倍更巧妙地限制了n的范围*/

	}
}

阿姆斯特朗数问题我是参照了

C语言求解阿姆斯特朗数_fengchuixia的博客-CSDN博客_c语言阿姆斯特朗数

这位博主设置最大数和最小数很精巧,我一开始直接默认是三位数了,当然她的代码里面我也学到了利用一个第三变量检验输出,还有保护变量

#include<stdio.h>
int main()
{
int i,j,sum,p,flag;i=100;
j=1;
flag=1;
p=1;
for(i=100;i<1000;i++)
{
     p=i;//要保护i,这个特别重要,因为i如果进入运算,会被破环,不满足条件
     sum=0;//这个也特别重要因为循环里面sum是累加的
    while(p)//因为每次乘法固定,可以利用循环来做
     {j=p%10;
     p=p/10;
     sum+=j*j*j;
     }
    if(sum==i)
    {
        printf("%d\n",sum);
        flag=0;//flag 来监测 ,注意检验写在循环外面
   }
 } 
 if(flag==1)
printf("none");
 return 0;
}

韩信点兵问题,韩信点兵其实也是遍历的思想,只不过利用break在找到第一个之后就可以跳出循环

//点兵问题
#include <stdio.h>
int main()
{
    int sum;
    sum=0;
    for(sum=1;;sum++)
    {
        if(sum%5==1&&sum%6==5&&sum%7==4&&sum%11==10)
        break;//break跳出循环的功能,很方便找第一个数

    }
         printf("%d",sum);
    return 0;
}

猴子吃桃问题,猴子吃桃也是无法初始化,没有初始数,只能倒过来求,倒过来求反着流程图做就行了

//猴子吃桃问题
#include <stdio.h>
int main()
{
 int sum;
 int cnt;
 cnt=9;
 sum=1;
 while(cnt>=1)
 {
     sum=(sum+1)*2;//注意是先加1再乘2,可以假设第一天14个桃,第二天6个桃,这样就很清楚了,其实正常是sum=sum/2,sum=sum-1,逆序应该是从下往上
    cnt--;
 }
 printf("%d",sum);
 return 0;
}

水手分椰子问题,这个比吃桃问题复杂一点

//水手分椰子问题
#include<stdio.h>
int main()
{
    int a,find=0,b,c,d,e,f;;
    for(a=1;!find;a++)
    {
        b=5*a+1;
        c=b/4.0*5+1;//保护b,注意4.0
        d=c/4.0*5+1;
        e=d/4.0*5+1;
        f=e/4.0*5+1;
        if(f%5==1&&e%5==1&&d%5==1&&c%5==1&&b%5==1)//确实没有想到这个,避免了小数问题
        {
            find=1;
            printf("原有%d个椰子",f);
        }
    }
    return 0;
}

这个也是网上找的一个答案,但是我认为不是很好,我看到过一个更好的答案

这个博主发了两种解法,但是我函数不是很熟,只看了一种解法

https://blog.csdn.net/weixin_36138524/article/details/117186537?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link

#include <stdio.h>

int main()
{
int i, j, total, n;
printf("Input n(1");
scanf("%d", &n);
if (n <= 1 || n > 5)
{
printf("Error!");
}
else
{
i = 1;
while(1)
{
total = i;
for(j = 0; j < n; j++)//
{
total = total * 5;
if(total % 4 != 0)//判断能被4整除,确定它是整数,这确实厉害,这一步
break;
total = total / 4;
total += 1;
}
if(j == n)//清零
break;
i++;
}
printf("y=%d", total);
}
return 0;
}

倒三角行九九乘法表,九九乘法表很简单,但是搞成这个下上三角形确实得思考一下

//改成上三角形式数乘表
#include <stdio.h>
int main()
{
	int i,j,m,cnt;
	i = 1;
	j = 1;
    m=0;
	while (i <= 9)
	
	{
		while(j<=9)
		{
			
			if(i*j==1)
			printf("1");
			else 
			printf("%3d",i*j);//倒三角必须从前面判断,所以只能利用m,m可以使使双位末位和单位之间的间距保持一致
			j++;
		
		
	}
		i++;
		j=i;
	m=m+1;
	cnt=m;//保护m,因为每次循环会消耗cnt
	printf("\n");
	printf(" ");
	while(cnt>1)
	{printf("   ");//无法在循环里添加空格的原因,因为循环会使空格成倍增加,所以在外循环里写个空格弥补
	cnt--;}	

}
}

编写程序,输入顶行字符和图形的高,输出如下所示图形。

就是菱形的ABCD问题,真把我难住了,不过明白了利用变量来初始化以控制循环的次数之后,就很简单了

参考了这个答主的答案,但是我觉得他的有点复杂,可能是因为没有注释的原因

编写C语言程序,输入顶行字符和图形的高,输出如下所示图形

#include <stdio.h>
int main()
{
int h,i,k,j,t;
scanf("%d,%c",&h,&k);
for(i=0;i<(h+1)/2;i++)//控制次数,先是上三行
{
    for(j=i;j<(h+1)/2-1;j++)
{ 
  printf(" ");
}
printf("%c",k);//打印字母
if(i!=0)//除了第一行以外的空格
{
  for(t=0;t<i*2-1;t++)
  {
      printf(" ");
  }
  printf("%c",k);
}
printf("\n");
k++;
}
k=k-2;
for(;i>1;i--)//下半部分的开始
{

for(j=(h+1)/2+1-i;j>=1;j--)
{
  printf(" ");
}
printf("%c",k);
if(i!=2)//不是最后一行
{
  for(t=1;t<=2*(i-2)-1;t++)
{
  printf(" ");
  }
  printf("%c",k);

}
printf("\n");
k--;
}
return 0;
}
/*写在最后,这道题其实分为两大步,三小步。第一部分解决上半部,有三个问题,每一层前面空几格,第二层开始中间的格数,以及一共几层
第二部分的问题就是和上面反过来,重点还是i的利用吧,几个条件都是找出了i与空格之间的关系,因为每次循环条件如果是固定的
想要控制循环次数,只能通过初始条件是个可以变化的量来解决,所以必须要用i这个会随着循环次数而变化的量
大循环是几层,里面的循环就是输出字母,如果不是第一层,这再输入空格,空格也是个有规律的数,可以用循环来处理*/

最后,希望一起加油

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值