GLORY | 学习·记录

coding for life

《算法竞赛入门经典》-读书笔记-排列&分数化小数

用1,2,3,···,9 组成 3 个三位数 abc,defghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出所有解。

题目特别写出了提示:不必太动脑筋。(其实这句话让我现在都不清楚我的解法是不是符合要求......)

1 #include<stdio.h>
2 #include<stdlib.h>
3 int main()
4 
{
5     int
num;
6     char
chr;
7     char a[10
];
8     char temp[3
];
9     char
pos;
10     //num*3<=987 所以 num<=329

11     for(num=123;num<=329;num++)
12 
    {
13         itoa(num,temp,10
);
14 
        strcpy(a,temp);
15         itoa(num*2,temp,10
);
16 
        strcat(a,temp);
17         itoa(num*3,temp,10
);
18         strcat(a,temp);//a保存了num以及num*2和num*3组成的字符串

19 
20         for(chr='1';chr<='9' && (pos=strchr(a,chr))!=NULL;chr++)
21 
            ;
22         if(pos!=
NULL)
23             printf("%d:%d:%d=1:2:3\n",num,num*2,num*3
);       
24 
    }
25     return 0
;
26 
}
27 

 今天继续读到了分数化小数题目,感觉挺简单的一个问题。实际藏着一个我并不知道的printf妙用。

  输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100.例如a=1,b=6,c=4时应输出0.1667.

printf的特殊用法,对于m.n的格式可以用如下方法表示

    char ch[20];
    printf("%*.*s\n",m,n,ch);
    前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n 。 这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。
1 #include<stdio.h>
2 int main()
3 
{
4     int
a,b,c;
5     scanf("%d %d %d",&a,&b,&
c);
6     printf("%.*lf",c,(double)a/
b);
7     return 0
;
8 }

posted on 2010-03-29 22:53 meglory 阅读(891) 评论(3)  编辑 收藏 引用 所属分类: Algorithms

评论

# re: 《算法竞赛入门经典》-读书笔记-排列&amp;分数化小数 2011-06-22 13:47 Bluesky.C.Z.

有个错误哦~
printf("%.*lf", c, (double)a / b);
这句话应该改成:
printf("%.*lf", c, (double)a / (double)b);
否则结果都是零呢  回复  更多评论   

# re: 《算法竞赛入门经典》-读书笔记-排列&amp;分数化小数 2011-06-24 18:41 meglory

@Bluesky.C.Z.
hi
谢谢回复。
更规范的写法应该是写成(double)a/(double)b,显式转换。
但是(double)a/b的时候b会自动转换成(double)类型的,我这里运行没有出现零。
你是拿什么数据测试的?  回复  更多评论   

# re: 《算法竞赛入门经典》-读书笔记-排列&amp;分数化小数 2011-07-19 11:27 MyLittleId

可是~~如果c > 16 的话之后的小数位就不对了。
ex.输入1 3 17
输出 0.33333333333333331  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

随笔分类

随笔档案

最新评论