【算法】(持续更ing)

1-1 圆柱体的表面积

输入底面半径r和高h,输出圆柱体的表面积,保留3位小数,格式见样例。

样例输入:

3.5 9

样例输出:

Area = 274.889

【分析】

圆柱体的表面积由3部分组成:上底面积、下底面积和侧面积。

由于上下底面积相等, 完整的公式可以写成:表面积=底面积×2+侧面积。

根据几何知识,底面积=πr^2,侧面积 =2πrh。不难写出完整程序:

#include <stdio.h> //输入输出库
#include <math.h>  //数学库
int main()        //主函数
{
	const double pi=acos(-1.0); //π的值
	double r,h,s1,s2,s;        //声明变量
	scanf("%lf%lf",&r,&h);    //输入半径和高
	s1=2*pi*r*r;                //上下底面的面积
	s2=2*pi*r*h;                //侧面的面积
	s=s1+s2;                    //总面积
	printf("Area=%.3f\n",s);    //以三位小数输出面积
	return 0;                    //返回值为0
}

1-2 三位数反转
输入一个三位数,分离出它的百位、十位和个位,反转后输出。
样例输入:
127
样例输出:
721
【分析】
首先将三位数读入变量n,然后进行分离。

百位等于n/100(注意这里取的是商的整数部 分),

十位等于n/10%10(这里的%是取余数操作),

个位等于n%10。程序如下:

#include <stdio.h>
int main()
{
	int n,m;
	scanf("%d",&n);
	m=(n%10)*100+(n/10%10)*10+(n/100);
	printf("%03d\n",m);    //输出一个数值变量,不足3位在前面补0
	return 0;
}

1-2-1 四位数反转

#include <stdio.h>
int main()
{
	int n,m;
	scanf("%d",&n);
	m=(n%10)*1000+(n/100%10)*100+(n/10%10)*10+(n/1000);
	printf("%04d\n",m);
	return 0;
}

题1-3 交换变量
输入两个整数a和b,交换二者的值,然后输出。
样例输入:
824 16
样例输出:
16 824
【分析】
方法1:按照题目所说,先把输入存入变量a和b,然后交换。如何交换两个变量呢?最经典的方法是三变量法

#include <stdio.h>
int main()
{
	int a,b,t;    //定义临时变量t
	scanf("%d%d",&a,&b);
	t=a;
	a=b;
	b=t;
	printf("%d %d\n",a,b);
	return 0;
}

方法2:不借助任何变量,类似“倒酱油”

#include <stdio.h>
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	a=a+b;
	b=a-b;
	a=a-b;
	printf("%d %d\n",a,b);
	return 0;
}

1-4 鸡兔同笼
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如 果无解,则输出No answer。
样例输入:
14 32
样例输出:
12 2
样例输入:
10 16
样例输出:
No answer
【分析】
设鸡有a只,兔有b只,则a+b=n,2a+4b=m,联立解得a=(4n-m)/2,b=n-a。 在什么情况下此解“不算数”呢?首先,a和b都是整数;其次,a和b必须是非负的。可以通过 下面的程序判断:

#include <stdio.h>
#include <math.h>
int main()
{
	int a,b,n,m;
	scanf("%d%d",&n,&m);
	a=(4*n-m)/2;
	b=n-a;
	if(m%2==1||a<0||b<0)
		printf("No answer\n");
	else
		printf("%d %d\n",a,b);
	return 0;
}

1-5 三整数排序
输入3个整数,从小到大排序后输出。
样例输入:
20 7 33
样例输出:
7 20 33
【分析】

#include <stdio.h>
#include <math.h>
int main()
{
	int a,b,c,t;
	scanf("%d%d%d",&a,&b,&c);
	if(a > b) { t = a; a = b; b = t; } //执行完毕之后a≤b  
	if(a > c) { t = a; a = c; c = t; } //执行完毕之后a≤c,且a≤b依然成立  
	if(b > c) { t = b; b = c; c = t; }  
	printf("%d %d %d\n", a, b, c); 
	return 0;
}

2-1 aabb
输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)。

【分析】

方法1:

#include<stdio.h>
#include<math.h> 
int main() 
{  
	for(int a = 1; a <= 9; a++)  
		for(int b = 0; b <= 9; b++)  
		{     
			int n = a*1100 + b*11; //这里才开始使用n,因此在这里定义n    
			int m = floor(sqrt(n) + 0.5);  
			if(m*m == n) printf("%d\n", n);  
		 }  
		return 0;
 }

方法2:

#include<stdio.h>
int main() 
{  
	for(int x = 1; ; x++)  
	{    
		int n = x * x;    
		if(n < 1000) continue;    
		if(n > 9999) break;    
		int hi = n / 100;    
		int lo = n % 100;    
		if(hi/10 == hi%10 && lo/10 == lo%10) 
			printf("%d\n", n);  
	} 
	return 0; 
}

2-2 3n+1问题
猜想(4):对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半。 经过若干次这样的变换,一定会使n变为1。例如,3→10→5→16→8→4→2→1。
输入n,输出变换的次数。n≤109。
样例输入:
3
样例输出:
7

【分析】

#include<stdio.h> 
int main() 
{  
	int n2, count = 0;
	scanf("%d", &n2);  
	long int n = n2;  
	while(n > 1)  
	{    
		if(n % 2 == 1) 
			n = n*3+1;    
		else n /= 2;   
		count++;  
	} 
	printf("%d\n", count);
	return 0; 
}

2-3 近似计算
计算 ,直到最后一项小于10^-6。
【分析】

#include<stdio.h> 
int main() 
{  
	double sum = 0; 
	for(int i = 0; ; i++)
	{    
		double term = 1.0 / (i*2+1);   
		if(i % 2 == 0) 
			sum += term;    
		else
			sum -= term;    
		if(term < 1e-6)
			break;  
	}  
	printf("%.6f\n", sum);
	return 0;
 }

2-4 阶乘之和
输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤106,n!表示 前n个正整数之积。
样例输入:
10
样例输出:
37913
【分析】

#include<stdio.h>
int main() 
{  
	int n, S = 0; 
	scanf("%d", &n); 
	for(int i = 1; i <= n; i++) 
	{    
		int factorial = 1;   
		for(int j = 1; j <= i; j++)  
			factorial *= j;   
		S += factorial; 
	}
	printf("%d\n", S % 1000000);  
	return 0; 
}

当n=100时,输出-961703。直觉告诉我 们:乘法又溢出了。

#include<stdio.h> 
#include<time.h>
int main() 
{  
	const int MOD = 1000000;  
	int n, S = 0;  
	scanf("%d", &n); 
	for(int i = 1; i <= n; i++) 
	{    
		int factorial = 1;   
		for(int j = 1; j <= i; j++)   
			factorial = (factorial * j % MOD);
		S = (S + factorial) % MOD;  
	}  
	printf("%d\n", S); 
	printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC); 
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值