1.输出格式
输出格式,注意浮点数和整型数据之间的区别。如果输入是double型的数据则用long float表示,注意要用%lf表示。
printf("%.1f\n",8.0/5.0);//1.6
printf("%.2f\n",8.0/5.0);//1.60
printf("%lf\n",8.0/5.0);//1.600000
printf("%d\n",8.0/5.0);//-1717916918
printf("%d\n",8/5);//1
printf("%.1f\n",8/5);//0.0
圆柱体的表面积
输入底面半径r和高h,输出圆柱体的表面积,保留3位小数。
#include <stdio.h>
#include <math.h>
int main()
{
const double pi = 4.0 * atan(1.0);//tan(pi/4)=1,atan(1)=pi/4;
double r,h,s1,s2,s;
scanf("%lf%lf",&r,&h);
s1=pi*r*r;
s2=2*pi*r*h;
s=s1*2.0+s2;
printf("Area = %.3lf\n",s);
return 0;
}
三位数翻转
输出的语句格式分为输不输出百位的0。
#include <stdio.h>
#include <math.h>
int main()
{
int n,m;
scanf("%d",&n);
m = (n%10)*100 + (n/10 %10)*10 +n/100;
printf("%d\n",m);
printf("%03d\n",m);
return 0;
}
2.完全平方数
如何判断开根号是否为整数,用floor(x+0.5)==x来判断,其中floor(x+0.5)==1的区间是[0.5,1.5),这样是为了避免高精度误差
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,n;
double m;
for(a=1;a<=9;a++)
for(b=1;b<=9;b++)
{
n = a * 1100 + b* 11;
m = sqrt(n);
if(floor(m+0.5)==m) printf("%d\n", n);
}
return 0;
}
还是避免这种开根号吧,一个残缺的循环用break来跳出循环
#include <stdio.h>
#include <math.h>
int main()
{
int x,n,hi,lo;
for(x=1;;x++)
{
n=x*x;
if(n<1000) continue;
if(n>9999) break;
hi = n/100;
lo = n%100;
if(hi/10==hi%10 && lo/10==lo%10) printf("%d\n", n);
}
return 0;
}
3.3n+1问题
其实主要就是解决3n会乘法溢出的问题,当然可以用大数乘法去做,但是太麻烦了,只要用unsigned long long 就行,但是VC不支持。
#include<stdio.h>
#include<math.h>
int main()
{
unsigned __int64 n;
unsigned __int64 count=0ui64;
scanf("%I64u",&n);
while(1ui64<n)
{
if(n%2ui64==1ui64)
{
n=3ui64*n+1ui64;
}
else
{
n=n/2ui64;
}
count++;
if(n==1ui64) break;
}
printf("%I64u\n",count);
return 0;
}
4.阶乘之和
乘法溢出问题,注意到n>25之后结果不变...
#include<stdio.h>
#include<math.h>
int main()
{
const int MOD=1000000;
int i,j,n,S=0;
scanf("%d",&n);
if(n>25) n=25;
int fac = 1;
for(i=1;i<=n;i++)
{
fac = fac * i % MOD;
S = (S + fac) % MOD;
}
printf("%d\n",S);
return 0;
}
5.分数化小数
注意这种输出格式: printf("%.*lf\n",c,(double) a/b);
#include<stdio.h>
#include<math.h>
#define INF 1000000
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%.*lf\n",c,(double) a/b);
return 0;
}
如果用正常的除法运算去做
#include<stdio.h>
int main()
{
int i,a,b,c,tmp;
scanf("%d%d%d",&a,&b,&c);
//printf("%.*lf\n",c,(double)a/b);
printf("%d.",a/b);
for(i=1;i<=c;i++)
{
a = (a%b)*10;
if(i!=c)
printf("%d",a/b);
else
{
tmp = (a%b)*10;
if(tmp/b>=5)
printf("%d",a/b+1);
else printf("%d",a/b);
}
}
printf("\n");
return 0;
}
6.排列
1,2...9,每个数字用一次组成三个三位数,abc,def,ghi,要求三个数之比为1:2:3,输出所有解。
#include<stdio.h>
#include<math.h>
#define INF 1000000
int main()
{
int x,y,z,i,sum=0;
int a[10]={0};
for(x=100;x<1000;x++)
{
sum=0;
y = 2*x;
z = 3*x;
a[x/100 %10]=1;a[(x/10) %10]=1;a[x%10]=1;
a[y/100 %10]=1;a[(y/10) %10]=1;a[y%10]=1;
a[z/100 %10]=1;a[(z/10) %10]=1;a[z%10]=1;
for(i=1;i<10;i++)
{
sum += a[i];
a[i]=0;
}
if(sum==9) printf("%d %d %d\n",x,y,z);
}
return 0;
}