题目:
描述:
有 n 盏灯,编号为 1~n,第 1 个人把所有灯打开,第 2 个人按下所有编号为 2 的倍数的开关(这些灯将被关掉),第 3 个人按下所有编号为 3 的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有 k 个人,问最后有哪些灯开着?输入:n 和 k,输出开着的灯编号。k≤n≤1000
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
问题分析:
由于是输出任意精度的结果,所以不能采用常规的格式化输出函数,所以只能模拟手工计算一位一位地输出小数位数(整数位可以一起输出),同时考虑到进位问题,故最佳方案是将数一位一位存储起来,根据最后一位四舍五入
代码
#include<stdio.h>
int main()
{
int a,b,c,yu,kase=0;
while(scanf("%d%d%d",&a,&b,&c)) //输入多组数据的推荐写法
{
if(a==0&&b==0&&c==0)
break;
kase++;
int num[101];
num[0]=a/b;
yu=a%b;
for(int i=1;i<=c+1;i++)
{
num[i]=yu*10/b;
yu=yu*10%b;
if(i==c+1)
{
if(num[i]>=5)
{
i--;
num[i]+=1;
}
while(num[i]==10&&i>0)
{
num[i]=0;
num[i-1]+=1;
i--;
}
break;
}
}
printf("Case %d: %d.",kase,num[0]);
for(int i=1;i<=c;i++)
printf("%d",num[i]);
printf("\n");
}
return 0;
}