//习题2-1
#include <stdio.h>
#include <math.h>
int main()
{
int A, B, C;
for(int i = 100; i <= 999; i++)
{
A = i / 100;
B = i / 10 % 10;
C = i % 10;
if(i == pow(A, 3) + pow(B, 3) + pow(C, 3)) printf("%d ", i);
}
return 0;
}
//习题2-2
#include <stdio.h>
int main()
{
int a, b, c, i, count = 0;
FILE *fin;
fin = fopen("input.txt", "r");
while(fscanf(fin, "%d%d%d", &a, &b, &c) == 3)
{
for(i = 10; i<=100; i++)
{
if(i % 3 == a && i % 5 == b && i % 7 == c)
{
printf("Case %d: %d\n", ++count, i);
break;
}
}
if(i == 101) printf("Case %d: No answer\n", ++count);
}
fclose(fin);
return 0;
}
//习题2-3
#include <stdio.h>
int main()
{
int n,i = 1;;
scanf("%d", &n);
for(; n >= 1; n--)
{
for(int j = 1; j <= 2*i-1; j++) printf(" ");
i++;
for(int k = 1; k <= 2*n-1; k++) printf("# ");
printf("\n");
}
return 0;
}
//习题2-4
#include <stdio.h>
int main()
{
FILE *fin;
int m,n,count = 0;
fin = fopen("data.txt", "r");
fscanf(fin, "%d%d", &n, &m);
while(m && n)
{
double s = 0;
int i = n;
for(; i <= m; i++)
{
s += 1.0/((double)i * (double)i); //不强转为double就会int类型溢出
}
printf("Case %d: %.5f\n", ++count, s);
fscanf(fin, "%d%d", &n, &m);
}
fclose(fin);
return 0;
}
//习题2-5
//方法一:当c>16时,不能解决问题,因为浮点数的精度为小数点后16位
#include <stdio.h>
#include <math.h>
int main()
{
FILE *fin, *fout;
fin = fopen("data2.txt", "r");
fout = fopen("output.txt", "w");
int a, b, c, count = 0;
fscanf(fin, "%d%d%d", &a, &b, &c);
while(a && b && c)
{
double m = (double)a / b; //小数第16位之后就开始不准了
fprintf(fout, "Case %d: %.*f\n", ++count, c, m); //floor函数原型为 double floor(double org); 返回值还是double型,所以输出时
//用%.*f输出
//格式化输出(printf)的特殊用法。如printf(“% * . * lf\n”, 8, 4, (double)1/6); 会输出8个字宽保留4位小数的浮点数运算结果。
fscanf(fin, "%d%d%d", &a, &b, &c);
}
fclose(fin);
fclose(fout);
return 0;
}
//方法二,模拟竖式除法过程
#include <stdio.h>
int n,m[101];//n整数部分,m小数部分
int main()
{
int a,b,c,i,k=0;
FILE *fin, *fout;
fin = fopen("data2.txt", "r");
fout = fopen("output.txt", "w");
fscanf(fin, "%d%d%d", &a, &b, &c);
while(a && b && c)
{
k++;
n = a / b; //n是整数部分
a = a % b; //a是余数
m[0] = 0;//十分位小数,可以进位为整数
for(i=1; i<=c; i++)
{
m[i] = a * 10 / b; //第i个余数除以B的整数部分,也就是我们要求的小数的第i位
a = a * 10 % b; //第i个余数除以b的余数部分
}
if(a*10/b >= 5)//第C+1位,四舍五入
{
for(i=c; i>=0; i--)//进位处理
{
m[i] = m[i] + 1; //进位操作
if(m[i] < 10)
break;//若不存在进位,跳出循环
else
m[i] -= 10; //否则继续进行进位操作
}
}
n = n + m[0];//整数部分进位处理。
fprintf(fout, "Case %d: %d.", k, n);//打印整数部分及小数点
for(i=1; i<=c; i++)
fprintf(fout, "%d", m[i]);//打印小数部分。
fprintf(fout, "\n");
fscanf(fin, "%d%d%d", &a, &b, &c);
}
fclose(fin);
fclose(fout);
return 0;
}
//习题2-6
#include <stdio.h>
int main()
{
int x, y, z;
for(x = 123; x <= 329; x++)
{
y = 2 * x;
z = 3 * x;
int flag = 0;
int num[10] = {0};
num[x/100]++; num[x%100/10]++; num[x%10]++;
num[y/100]++; num[y%100/10]++; num[y%10]++;
num[z/100]++; num[z%100/10]++; num[z%10]++;
for(int i=1; i<=9; i++)
{
if(num[i] == 0)
{
flag = 1;
break;
}
}
if(!flag)
{
printf("%d %d %d \n", x, y, z);
}
}
return 0;
}
算法竞赛 入门经典(第2版) 第二章习题答案 仅供参考
最新推荐文章于 2022-06-19 22:35:11 发布