第二章
第二章习题
/*
位数
输入一个不超过10^9的正整数,输出它的位数。例如12735的位数是5.请不要使用任何数学函数,只用四则运算和循环语句实现。
*/
1 #include <stdio.h> 2 int main() 3 { 4 FILE *fin,*fout; 5 fin = fopen("data.in","rb"); 6 fout = fopen("data.out","wb"); 7 int n,count = 1; 8 fscanf(fin,"%d",&n); 9 if(n < 10E9 && n >= 0) 10 while(n > 1) 11 { 12 n /= 10; 13 count ++; 14 } 15 fprintf(fout,"%d\n",count); 16 fclose(fin); 17 fclose(fout); 18 19 return 0; 20 }
/*
水仙花数
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A^3 + B^3 + C^3,则称其为水仙花数。例如153 = 1^3 + 5^3 + 3^3,所以153时水仙花数。
*/
1 #define CLOCK 2 #include <stdio.h> 3 int main() 4 { 5 #ifdef CLOCK 6 freopen("data.in","r",stdin); 7 freopen("data.out","w",stdout); 8 #endif 9 int n = 100,A,B,C; 10 for(;n <= 999;n ++) 11 { 12 A = n % 10; 13 B = n / 10 % 10; 14 C = n / 100; 15 //printf("%d %d %d",A,B,C); 16 if(n == A*A*A + B*B*B + C*C*C) 17 printf("%d\n",n); 18 } 19 20 return 0; 21 }
/*
韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排,五人一排,七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数。输入3个非负整数a,b,c,表示每种队形排尾的人数(a《3,b《5,c《7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100.
样例输入:2 1 6
样例输出:41
样例输入:2 1 3
样例输出:No answer
*/
1 #define CLOCK 2 #include <stdio.h> 3 int main() 4 { 5 #ifdef CLOCK 6 freopen("data.in","r",stdin); 7 freopen("data.out","w",stdout); 8 #endif 9 int a,b,c,i; 10 scanf("%d%d%d",&a,&b,&c); 11 for(i = 10;i < 100;i ++) 12 if(i % 3 == a && i % 5 == b && i % 7 == c) 13 { 14 printf("%d\n",i); 15 break; 16 } 17 if(i == 100) 18 { 19 printf("No answer\n"); 20 } 21 22 return 0; 23 }
/*
倒三角形
输入正整数n《=20,输出一个n层的倒三角形。例如n=5时输出如下:
##########
#######
#####
###
#
*/
1 #define CLOCK 2 #include <stdio.h> 3 int main() 4 { 5 #ifdef CLOCK 6 freopen("data.in","r",stdin); 7 freopen("data.out","w",stdout); 8 #endif 9 int n,i,j; 10 scanf("%d",&n); 11 for(i = 0;i < n;i ++) 12 { 13 for(j = n - i;j < n;j ++) 14 printf(" "); 15 for(j = 0;j < 2 * (n - i) - 1;j ++) 16 printf("#"); 17 printf("\n"); 18 } 19 }
/*
统计
输入一个正整数n,然后读取n个正整数a1,a2.。an,最后再读一个正整数m。统计a1,a2.。an中有多少个整数的值小于m。提示:如果重定向和fopen都可以使用,哪个比较方便?
*/
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 ifstream fin("data.in"); 5 ofstream fout("data.out"); 6 int main() 7 { 8 int n,i,count = 0; 9 cin >> n; 10 int a[n],m; 11 for(i = 0;i < n;i ++) 12 fin >> a[i]; 13 cin >> m; 14 for(i = 0;i < n;i ++) 15 if(a[i] < m) 16 count ++; 17 fout << count << endl; 18 19 return 0; 20 }
/*
调和级数
输入正整数n,输出H(n)=1 + 1/2 + 1/3 + 。。 + 1/n的值,保留3位小数。例如n=3时答案为1.833.
*/
1 #include <iostream> 2 #include <fstream> 3 #include <iomanip> 4 using namespace std; 5 ifstream fin("data.in"); 6 ofstream fout("data.out"); 7 int main() 8 { 9 int n,i = 1; 10 double sum = 0; 11 fin >> n; 12 while(i <= n) 13 { 14 sum += (1.0/i); 15 i ++; 16 } 17 fout << fixed << setprecision(3) << sum << endl; 18 19 return 0; 20 }
/*
近似计算
计算PI/4 = 1 - 1/3 + 1/5 + 。。,直到最后一项小于10^-6
*/
1 #include <iostream> 2 #include <fstream> 3 #include <iomanip> 4 using namespace std; 5 ifstream fin("data.in"); 6 ofstream fout("data.out"); 7 int main() 8 { 9 int i; 10 double sum = 0,n = 1; 11 for(i = 1;(i <= n) && (1.0/n >= 10E-6);i ++) 12 { 13 if(i % 2 == 1) 14 sum += (1.0/n); 15 else 16 sum -= (1.0/n); 17 n += 2.0; 18 } 19 fout << sum << endl; 20 21 return 0; 22 }
/*
子序列的和
输入两个正整数n《m《10^6,输出1/n^2 + 1/(n + 1)^2 + .. + 1 / m^2,保留5位小数,例如n=2,m=4时答案是0.42361;n=65535,m=65560时答案为0.00001.注意:本题有陷阱
*/
1 #include <iostream> 2 #include <fstream> 3 #include <iomanip> 4 using namespace std; 5 ifstream fin("data.in"); 6 ofstream fout("data.out"); 7 int main() 8 { 9 int i,n,m; 10 double sum = 0; 11 fin >> n >> m; 12 if(n < m && n > 0 && m > 0) 13 for(i = n;i <= m;i ++) 14 sum += 1.0 / i / i; 15 fout << fixed << setprecision(5) << sum; 16 17 return 0; 18 }
/*
分数化小数
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b《=10^6,c<=100。例如a=1,b=6,c=4时应输出0.1667.
*/
1 #include <iostream> 2 #include <fstream> 3 #include <iomanip> 4 using namespace std; 5 ifstream fin("data.in"); 6 ofstream fout("data.out"); 7 int main() 8 { 9 int a,b,c; 10 cin >> a >> b; 11 fin >> c; 12 double division; 13 division = (double)a/b; 14 //cout << division << endl; 15 if(a < 10E6 && b < 10E6 && c <= 100) 16 { 17 fout << fixed << setprecision(c) << division << endl; 18 } 19 20 return 0; 21 }
/*
用1,2,3,.。,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3,输出所有解。提示:不必太动脑筋。
此题参考http://blog.csdn.net/litiouslove/article/details/7891700
*/
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 ifstream fin("data.in"); 5 ofstream fout("data.out"); 6 int main() 7 { 8 int arr[10] = {0}; 9 int a,b,c,i,s; 10 for(a = 100;a < 333;a ++) 11 { 12 s = 0; 13 b = 2 * a; 14 c = 3 * a; 15 arr[a / 100] = arr[a / 10 % 10] = arr[a % 10] = 1; 16 arr[b / 100] = arr[b / 10 % 10] = arr[b % 10] = 1; 17 arr[c / 100] = arr[c / 10 % 10] = arr[c % 10] = 1; 18 for(i = 1;i < 10;i ++) 19 s += arr[i]; 20 if(s == 9) 21 fout << a << b << c << endl; 22 for(i = 0;i < 10;i ++) 23 arr[i] = 0; 24 } 25 26 return 0; 27 }

浙公网安备 33010602011771号