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;
}