目录
1、习题2-5 分数化小数(decimal)
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。
输 入包含多组数据,结束标记为a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
#include <stdio.h>
#include <math.h>
int main ()
{
int a, b, c, cnt = 0;
while(scanf("%d%d%d", &a, &b, &c) != EOF)
{
if(a == 0 && b == 0 && c == 0)
break;
else
{
int i = floor((double)a/b);
printf("Case %d:%d.", ++cnt, i);
int j = a-i*b;
for(int k = 1; k < c; k++)
{
i = floor(j*10/b);
j = j*10-i*b;
printf("%d", i);
}
i = floor((double)j*10/b + 0.5);
printf("%d", i);
printf("\n");
}
}
return 0;
}
2、习题2-6 排列
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解.
我最开始想的是直接遍历判断,但是感觉麻烦。后来发现如果设置i为最小的数,判断i*3<1000,再接着分解每一位数字,把出现的数字存到一个数组里面,记录出现的次数,如果大于2则表示不行。
但是依然很麻烦。于是百度一下,发现一个大神的做法,惊艳到了我。 膜拜去了~~
大神思路:
两个关键点:
1、i 最小只能是123, 最大只能是329(因为最大数字只能是987)
2、1~9加起来能是45, 1~9乘起来只能是362880
所以我们可以将前面的i, j, k分别分解出来的9位数字相加, 相乘,
看最后的结果是不是45,362880。
原文链接:https://zhidao.baidu.com/question/1829939023362385740.html
#include <bits/stdc++.h>
using namespace std;
void result(int num, int &result_add, int &result_mul)
{
int i, j, k;
i = num / 100; //百位
j = num / 10 % 10; //十位
k = num % 10; //个位
result_add += i + j + k; //分解出来的位数相加
result_mul *= i * j * k; //相乘
}
int main()
{
int i, j, k;
int result_add, result_mul;
for(i = 123; i <=329; i++)
{
j = i * 2;
k = i * 3;
result_add = 0;
result_mul = 1;
result(i, result_add, result_mul);
result(j, result_add, result_mul);
result(k, result_add, result_mul);
if(result_add == 45 && result_mul == 362880)
printf("%d %d %d\n", i, j, k);
}
return 0;
}