习题2-8:输入两个正整数n<m<10^6,输出1/n^2+1/(n+1)^2+----+1/m^2,保留5位小数。
习题2-10:用1,2,3---,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。提示:不必太动脑筋。
注意问题:但i很大是,i*i会溢出,所以要写出1.0/i/i的形式。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
int i,n,m;
double s=0;
scanf("%d%d",&n,&m);
for(i=n;i<=m;i++)
{
s+=1.0/i/i;
}
printf("%.5lf\n",s);
return 0;
}
在网上有下面这种做法,利用printf("%*.*lf,x,y,n);来控制输出的小数位数。但double类型只能精确到小数点后17位。
#include <stdio.h>
int main(int argc, char *argv[])
{
int i,a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%.*lf\n",c,(double)a/b);
return 0;
}
下面是自己的做法:
存在的问题:小数点末尾不能进行四舍五入、懒得改了、
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
int i,a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d.",a/b);
a%=b;
for(i=1;i<=c;i++)
{
a*=10;
printf("%d",a/b);
a%=b;
}
return 0;
}
习题2-10:用1,2,3---,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。提示:不必太动脑筋。
竟然题目都说了不必太动脑筋,那就用最丑陋的穷举法做吧。(其实我也想不到其他的方法^_^)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
int a[9];
for(a[0]=1;a[0]<10;a[0]++)
for(a[1]=1;a[1]<10;a[1]++)
if(a[0]!=a[1])
for(a[2]=1;a[2]<10;a[2]++)
if(a[2]!=a[0]&&a[2]!=a[1])
for(a[3]=1;a[3]<10;a[3]++)
if(a[3]!=a[0]&&a[3]!=a[1]&&a[3]!=a[2])
for(a[4]=1;a[4]<10;a[4]++)
if(a[4]!=a[0]&&a[4]!=a[1]&&a[4]!=a[2]&&a[4]!=a[3])
for(a[5]=1;a[5]<10;a[5]++)
if(a[5]!=a[0]&&a[5]!=a[1]&&a[5]!=a[2]&&a[5]!=a[3]&&a[5]!=a[4])
for(a[6]=1;a[6]<10;a[6]++)
if(a[6]!=a[0]&&a[6]!=a[1]&&a[6]!=a[2]&&a[6]!=a[3]&&a[6]!=a[4]&&a[6]!=a[5])
for(a[7]=1;a[7]<10;a[7]++)
if(a[7]!=a[0]&&a[7]!=a[1]&&a[7]!=a[2]&&a[7]!=a[3]&&a[7]!=a[4]
&&a[7]!=a[5]&&a[7]!=a[6])
for(a[8]=1;a[8]<10;a[8]++)
if(a[8]!=a[0]&&a[8]!=a[1]&&a[8]!=a[2]&&a[8]!=a[3]&&a[8]!=a[4]
&&a[8]!=a[5]&&a[8]!=a[6]&&a[8]!=a[7])
{
if( ( (a[0]*100+a[1]*10+a[2])*2 == a[3]*100+a[4]*10+a[5] )
&& ( (a[0]*100+a[1]*10+a[2])*3 == a[6]*100+a[7]*10+a[8]) )
{
printf("%d%d%d %d%d%d %d%d%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
}
}
return 0;
}