算法竞赛入门经典第二章练习

习题2-8:输入两个正整数n<m<10^6,输出1/n^2+1/(n+1)^2+----+1/m^2,保留5位小数。

注意问题:但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;
}


习题2-9:输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100.

在网上有下面这种做法,利用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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值