第二章

 第二章习题

/*

位数

  输入一个不超过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 }
posted @ 2014-01-20 13:20  七彩蝶  阅读(286)  评论(0)    收藏  举报