算法竞赛入门经典(第二版)第二章循环结构程序设计注解与习题下

2-4子序列的和

输入两个正整数n<m<10^6,输出1/ n^2+1/ (n+1)^2+……+1/ m^2,保留5位小数。输入包含多组数据,结束标记为n=m=0.提示:本题有陷阱
本题思路在于乘法溢出的问题
陷阱就是关于int类型的极限,因为Int的上限是2^32-1

#include <stdio.h>
int main()
{
           int n,m;
           double a;
           while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
           {
               a=0.0;
               for(long long i=n;i<=m;i++)//若变为int类型则,会有乘法溢出的问题
               {
                   double b=i*i;
                   a+=1/b;
               }
               printf("%.5f\n",a);
           }
}

2.5 分数化小数

输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100.输入包含多组数据,结束标记位a=b=c=0

#include<stdio.h>
int main()
{
    int a,b;
    int c,i;
    while(scanf("%d %d%d",&a,&b,&c)!=EOF&&a,b,c)
    {
    int d[110];//小数点后面数字用数组表示出来
    d[0]=0;
    for(i=1;i<=c;i++)
    {
        int e=a*10/b;
        d[i]=e%10;
        a=a*10;
    }
    d[i]='\0';
    if(d[i-1]>=5) d[i-1]+=1;
    printf("0.");
    for(i=1;d[i]!='\0';i++)
    {
        printf("%d",d[i]);
    }
         printf("\n");
    }
}

2.6 排列

用1,2,3,……9组成3个三位数 abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。
按照”abc def ghi”的格式输出所有解,每行一个解。
思路:1:2:3可以说明假设用一个最小的三位数就可以表示出其他的二个数,然后就是最小的三位数是123,它的最大值是987/3得到329
还有就是判断是否每个数字只使用了一次

#include <stdio.h>
int main() {
	int a,b,c,d,e,f,g,h,i,j,k,l,m,o;
	for(int a=123;a<=329;a++)
	{
	    int n=0;
	    b=a;
	    c=b/100;
	    d=b/10%10;
	    e=b%10;
	    f=b*2;
	    g=f/100;
	    h=f/10%10;
	    i=f%10;
	    j=b*3;
	    k=j/100;
	    l=j/10%10;
	    m=j%10;
       for(o=1;o<=9;o++)
       {
         if(c==o)n++;
         else if(d==o) n++;
         else if(e==o) n++;
         else if(g==o) n++;
         else if(h==o) n++;
         else if(i==o) n++;
         else if(m==o) n++;
         else if(k==o) n++;
         else if(l==o) n++;
	   }
       if(n==9)
        printf("%d\t%d\t%d\n",b,f,j);
}
}

猜你喜欢

转载自blog.csdn.net/qq_43233736/article/details/83040435