C语言--循环实例

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

/*
采取逆向思维的方法,从后往前推断。
x1=x
x2=(x1/2)-1
x3=(x2/2)-1
....
x9=(x8/2)-1
x10=1

x10=(x9/2)-1
<==>
x9=(x10+1)*2

y=(x+1)*2
x=y

*/
#include<stdio.h>

int main()
{
	int x=1,y=0,day;
	for(day=1;day<=9;day++)
	{
		y=(x+1)*2;
		x=y;
	}
	printf("%d",y);
	
	return 0;
}

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?


#include<stdio.h>
int main()
{
	float s=100;            //第一次落地时的距离
	float h=100;
	int i;
	h=h/2;			//第一次反弹的高度
	for(i=2;i<=10;i++)      //循环从第二次到第10次
	{
		s=s+h*2;        //总距离=上一次的距离+上一次反弹高度*2
		h=h/2;	        //高度=上一次高度/2
	}
	printf("s=%f,h=%f\n",s,h);
	return 0;
}

1到20的阶层

#include<stdio.h>
int main()
{
	double i,j,sum,a=0;
	for(i=1;i<=20;i++)
	{
		sum=1;
		for(j=1;j<=i;j++)
		{
			sum=sum*j;	
		}
		a=a+sum;
	}
	printf("%lf",a);
}

https://blog.siriyang.cn/posts/20200310191333id.html

//判断素数

/*
输入一个数n,让他依次除以i(i从2到n-1),如果能被其中任意一个数整除,就不是素数 


方法1: 如果能被其中任意一个数整除,就break跳出,此时的i肯定小于n,
因为循环次数未达到n次,如果n不能被任何一个数整除,就不会执行break,循环次数就会达到n次
(虽然最后一次判断是i<n,但是,此次循环过后还要i++),所以如果i==n,那就是素数 
即:小于n就不是素数,否则就是素数 

#include<stdio.h>
int main()
{
	int n,i;
	printf("输入一个数:\n");
	scanf("%d",&n);
	for(i=2;i<n;i++)				//i取不到1和n 
		if(n%i==0)
			break;
	if(i<n)							//i的次数未达到n次 
		printf("%d不是素数\n",n);
	else 							//实际上刚好是i==n 
		printf("%d是素数\n",n);
	
	return 0;
}
*/

/*
程序改进,其实n不必被 '从2到n-1' 的每个数来除,只需被 '从2到(n-1)/2' 的每个数来除即可,
甚至只需被 '从2到根下n' 的整数来除即可(根下n * 根下n = n) ,注意此时的i可以取到根下n
 
sqrt是求平方根的函数,参数为双精度,但如果是整型会自动转换为双精度 

#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,k;						//定义k,存放根下n 
	printf("输入一个数:\n");
	scanf("%d",&n);
	k=sqrt(n);						//双精度型数赋值给了k,又自动转换为了整型 
	for(i=2;i<=k;i++)				//此时的i可以取到n 
		if(n%i==0)
			break;
	if(i<=k)						//“=”说明可能是被最后一个数整除的 
		printf("%d不是素数\n",n);
	else 							//如果最后一个数也不能整除,那就i++,所以此时的i一定大于k,且i=k+1 
		printf("%d是素数\n",n);
	
	return 0;
}
*/


/*
方法二:预先定义一个标志变量,如果是素数赋值为1,如果不是素数赋值为2,最后判断这个变量的值是否为真 
 


#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,k,flag=1;				//先定义flag为1 
	printf("输入一个数:\n");
	scanf("%d",&n);
	k=sqrt(n);
	for(i=2;i<=k;i++)
		if(n%i==0)
		{
			flag=0;					//如果能被整除,就为0,即下面的条件为假,不是素数 
			break;					//并且停止后续判断		
		 }  
	if(flag)
		printf("%d是素数\n",n);
	else 
		printf("%d不是素数\n",n);
	
	return 0;
}

*/ 



//求100-200之间的素数

/*
#include<stdio.h>
#include<math.h>
int main()
{
	int i,j,k,flag;
	for(i=101;i<=200;i++)		//也可以i=i+2,因为偶数都不是素数,所以只需要对奇数进行判断即可 
	{
		flag=1;
		k=sqrt(i);
		for(j=2;j<=k;j++)
		{
			if(i%j==0)
			{
				flag=0;
				break;
			}
		
		}
		if(flag)
		printf("%d ",i);
	}
	return 0;
 } 

*/


//译密码 

/*
#include<stdio.h>
int main()
{
	char c;
	c=getchar();						//输入字符
	while(c!='\n')
	{
		if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))			//如果是字母 
		{
			if((c>='A'&&c<='V')||(c>='a'&&c<='v'))
				c=c+4;
			else
				c=c+4-26;
		}
		printf("%c",c);					//输出字符 
		c=getchar();					//输入下一个字符 
	}
	printf("\n");
	return 0;
 } 

*/


#include<stdio.h>
int main()
{
	char c;
	while((c=getchar())!='\n')					//前后两个读入字符合并成一个 
	{
		if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
		{
			c=c+4;
			if((c>='Z'&&c<='Z'+4)||(c>='z'))
			c=c-26;
		}
		printf("%c",c);
	}
	printf("\n");	
	return 0;
 } 
 
 
 


/*
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。


质数就是除去他自己和1不能被其他的数整除。 
合数与质数恰恰相反。 如果两个数只有公约数1那么这两个数就是互质数。 
把一个合数用质因数相乘的形式表示出来叫做分解质因数。

例子:12的分解质因数,可以有以下几种12=2x2x3=4x3=1x12=2x6
其中1,2,3,4,6,12都可以说是12的因数,即相乘的几个数等于一个自然数,那么这几个数就是这个自然数的因数。
2、3、4中2和3是质数,就是质因数,4不是质数。



程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成:

(1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。
(2)但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数n,重复执行第二步。
(3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。

*/

#include<stdio.h>
main()
{
	int i,n;
	printf("输入一个整数:\n");
	scanf("%d",&n);
	printf("%d=",n);
	for(i=2;i<=n;i++)			//可以取到n,因为n一直在变 
	{
		while(n%i==0)			//当n能够被i整除时 
		{
			printf("%d",i);		//输出i 
			n=n/i;				//并且把n除以i的商,当作新的数 
			if(n!=1)			//最后一个数的商一定为1,所以当不等于1时,输出乘法号 
				printf("*");
		}
	}
	printf("\n");
	return 0;
}



posted @ 2022-10-03 15:56  王智刚  阅读(19)  评论(0编辑  收藏  举报