计算阶乘和

对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。

输入格式:

输入在一行中给出一个不超过10的正整数N。

输出格式:

在一行中输出S的值。

输入样例:

3
 

输出样例:

9


 1 #include <stdio.h>
 2 void plus(int n)
 3 {
 4     int m = 0;
 5     
 6     while(n > 0)
 7     {
 8         int i = 0 ;
 9         int j = 1 ;
10         for( i = 1; i <= n; i++)
11         {
12             j*=i;
13             //printf("j = %d\n",j);
14         }
15         m=m+j;
16         //printf("m内 = %d\n",m);
17         n--;
18         //printf("n = %d\n",n);
19     }
20     printf("%d",m);
21 }
22 int main(void)
23 {
24     int n = 0;
25     scanf("%d",&n);
26     if(n < 0 || n > 10)
27     {
28         return 0;
29     }
30     plus(n);
31     return 0;
32 }

黑洞数

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)

例如,对三位数207:

  • 第1次重排求差得:720 - 27 = 693;
  • 第2次重排求差得:963 - 369 = 594;
  • 第3次重排求差得:954 - 459 = 495;

以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。

任意输入一个三位数,编程给出重排求差的过程。

输入格式:

输入在一行中给出一个三位数。

输出格式:

按照以下格式输出重排求差的过程:

序号: 数字重排后的最大数 - 重排后的最小数 = 差值
 

序号从1开始,直到495出现在等号右边为止。

输入样例:

123
 

输出样例:

1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
  1 #include <stdio.h> 
  2 int max(int n);
  3 int min(int n);
  4 void black(int n);
  5 int main(void)
  6 {
  7     int n = 0;
  8     scanf("%d",&n);
  9     if(n>999 || n < 100 || (n%10 == n/10%10 && n%10 == n/100))
 10     {
 11         return 0;
 12     }
 13     black(n);
 14     return 0;
 15 }
 16 int max(int n)
 17 {
 18     int a = n/100;
 19     int b = n/10%10;
 20     int c = n%10;
 21     while(1)
 22     {
 23        if(a <= b)
 24        {
 25            if(c < b)
 26         {
 27             if(a > c)//b >= a > c
 28             {
 29                 int temp = a;
 30                 a = b;
 31                 b = temp;
 32                 n = a*100+b*10+c;
 33                 return n;
 34             }
 35             else//b > c > a
 36             {
 37                 int temp = a;
 38                 a = b;
 39                 b = c;
 40                 c = temp;
 41                 n = a*100+b*10+c;
 42                 return n;
 43                 
 44             }
 45         }
 46         else //c > b >= a
 47         {
 48             int temp = a;
 49             a = c;
 50             c = temp;
 51             n = a*100+b*10+c;
 52             return n;
 53         }
 54        }
 55        else if(b < a)
 56        {
 57            if(c <= a)
 58            {
 59                if(b <= c)//a >= c > b
 60                {
 61                    int temp = b;
 62                    b = c;
 63                    c = temp;
 64                    n = a*100+b*10+c;
 65                 return n;
 66             }
 67             else // a > b > c
 68             {
 69                 return n;
 70             }
 71         }
 72         else // c > a > b
 73         {
 74             int temp = a;
 75             a = c;
 76             c = b;
 77             b = temp;
 78             n = a*100+b*10+c;
 79             return n;
 80         }
 81        }
 82    }
 83    return 0;
 84 }
 85 int min(int n)
 86 {
 87     int a = n/100;
 88     int b = n/10%10;
 89     int c = n%10;
 90     while(1)
 91     {
 92        if(a <= b)
 93        {
 94            if(c < b)
 95         {
 96             if(a > c)//b >= a > c
 97             {
 98                 int temp = a;
 99                 a = b;
100                 b = temp;
101                 n = c*100+b*10+a;
102                 return n;
103             }
104             else//b > c > a
105             {
106                 int temp = a;
107                 a = b;
108                 b = c;
109                 c = temp;
110                 n = c*100+b*10+a;
111                 return n;
112                 
113             }
114         }
115         else //c > b >= a
116         {
117             int temp = a;
118             a = c;
119             c = temp;
120             n = c*100+b*10+a;
121             return n;
122         }
123        }
124        else if(b < a)
125        {
126            if(c <= a)
127            {
128                if(b <= c)//a >= c > b
129                {
130                    int temp = b;
131                    b = c;
132                    c = temp;
133                    n = c*100+b*10+a;
134                 return n;
135             }
136             else // a > b > c
137             {
138                 return n;
139             }
140         }
141         else // c > a > b
142         {
143             int temp = a;
144             a = c;
145             c = b;
146             b = temp;
147             n = c*100+b*10+a;
148             return n;
149         }
150        }
151    }
152    return 0;
153 }
154 void black(int n)
155 {
156     int k,m = 1;
157     if(n != 495)
158     {
159     while(n != 495)
160      {
161       min(n);
162       max(n);
163       k = max(n)-min(n);
164       printf("%d: %d - %d = %d\n",m,max(n),min(n),k);
165       n = max(n)-min(n);
166       m++;
167      }
168     }
169     else
170     {
171         min(n);
172         max(n);
173         k = max(n)-min(n);
174         printf("%d: %d - %d = %d\n",m,max(n),min(n),k);
175     }
176     
177 }

 找完数

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<mn10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30
 

输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int m,n ;
 5     int flag = 1 ;
 6     scanf("%d %d",&m,&n);
 7     if(m<=1 || m>n || n>10000) 
 8     {
 9         printf("None");
10         return 0;
11     }
12     while(n != m)
13     {
14     int s = 1;
15       for(int i = 2; i<m; i++)
16      {
17         if(m%i == 0)
18         {
19             s= s + i;
20         }
21      }    
22      if(s == m)
23      {
24          printf("%d = 1",s);
25          flag++;
26         for(int j = 2; j<m; j++)
27        {
28          if(m%j == 0)
29          {
30              printf(" + %d",j);
31          }
32        }
33         printf("\n");
34      }    
35      m++;
36      if(flag>1 && m == n)
37      {
38          break;
39      }
40      else if(flag == 1 && m == n)
41      {
42          printf("None");
43          break;
44      }
45     }
46     if(n == m)
47     {
48      int s = 1;
49       for(int i = 2; i<m; i++)
50      {
51         if(m%i == 0)
52         {
53             s= s + i;
54         }
55      }    
56      if(s == m)
57      {
58          printf("%d = 1",s);
59         for(int j = 2; j<m; j++)
60        {
61          if(m%j == 0)
62          {
63              printf(" + %d",j);
64              flag++;
65          }
66        }
67         printf("\n");
68         if(flag == 1)
69         {
70            printf("None");
71         }
72      }    
73     }
74     return 0;
75  } 
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int m, n;
 6     scanf("%d%d", &m, &n);
 7 
 8     int i, j, sum;
 9     for (i = m; i <= n; i++) {
10         sum = 0;
11         for (j = 1; j <= i / 2; j++) { // 除自身外的因子不超过自身的一半
12             if (i % j == 0) {
13                 sum += j; // 累加因子
14             }
15         }
16         if (sum == i) { // 如果和等于自身,说明是完数
17             printf("%d = 1", i);
18             for (j = 2; j <= i / 2; j++) { // 除自身外的因子不超过自身的一半
19                 if (i % j == 0) {
20                     printf(" + %d", j);
21                 }
22             }
23             printf("\n");
24         }
25     }
26 
27     if (m > n || m <= 1) { // 输入非法,输出None
28         printf("None");
29     }
30 
31     return 0;
32 }

爬动的蠕虫

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:

输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。

输出格式:

在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:

12 3 1
 

输出样例:

11

 1 #include <stdio.h>
 2 void time(int n,int u,int d);
 3 int main(void)
 4 {
 5     int n,u,d;
 6     scanf("%d %d %d",&n,&u,&d);
 7     if(d>=u || n>100)
 8     {
 9         return 0;
10      } 
11     time(n,u,d);
12     return 0;
13 }
14 void time(int n,int u,int d)
15 {
16     int t = 1;
17     n= n-1;
18     while(n > 0)
19     {
20         if(n > u)
21         {
22             n-=u;
23             n+=d;
24             t=t+2;
25         }
26         else
27         {
28             n-=u;
29             t=t+2;
30         }
31     }
32     printf("%d",t);
33 }

 二进制的前导的零

计算机内部用二进制来表达所有的值。一个十进制的数字,比如24,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,有27个0。我们把这些0称作前导的零。

现在,你的任务是写一个程序,输入一个整数,输出在32位表达下它前导的零的个数。

输入格式:

一个整数,在32位的整数可以表达的范围内。

输出格式:

一个整数,表达输入被表达为一个32位的二进制数时,在第一个1之前的0的数量。

输入样例:

256
 

输出样例:

23

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int n;
 6     scanf("%d", &n);
 7     int count = 0;
 8     while ((n & 0x80000000) == 0 && count < 32) {
 9         n <<= 1;
10         count++;
11     }
12     printf("%d\n", count);
13     return 0;
14 }

 

求组合数

本题要求编写程序,根据公式Cnm=m!(nm)!n!算出从n个不同元素中取出m个元素(mn)的组合数。

建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double

输入格式:

输入在一行中给出两个正整数m和n(mn),以空格分隔。

输出格式:

按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。

输入样例:

2 7

 1 #include <stdio.h>
 2 double fact(int m,int n);
 3 int main(void)
 4 {
 5     int m,n;
 6     scanf("%d %d",&m,&n);
 7     if(m>n || m < 0 || (m==0 && n!= 0))
 8     {
 9         return 0;
10     }
11     double u = fact(m,n);
12     printf("result = %.0lf",u);
13     return 0;
14 }
15 double fact(int m, int n)
16 {
17     double a = 1.0;
18     double b = 1.0;
19     double c = 1.0;
20     double e = 0.0;
21     int d = n-m;
22     if(m == n)//(m==0 && n!= 0)不行 
23     {
24         return a; 
25     }
26     else // 0<m<n 
27     {
28         for(int i = 1; i<=n; i++)
29         {
30             a *= i;
31         }
32         for(int j = 1; j<=m; j++)
33         {
34             b *= j;
35         }
36         for(int k = 1; k<=d; k++)
37         {
38             c *= k;
39         }
40         e = a/(b*c);
41         return e;
42     }
43     return e;
44 }
 1 #include <stdio.h>
 2 
 3 double fact(int n) {
 4     double res = 1.0;
 5     for (int i = 2; i <= n; i++) {
 6         res *= i;
 7     }
 8     return res;
 9 }
10 
11 int main() {
12     int m, n;
13     scanf("%d %d", &m, &n);
14 
15     double c = fact(n) / (fact(m) * fact(n-m));
16     printf("result = %.0lf", c);
17 
18     return 0;
19 }

 输出华氏-摄氏温度转换表

 

输入2个正整数lowerupperlowerupper≤100),请输出一张取值范围为[lowerupper]、且每次增加2华氏度的华氏-摄氏温度转换表。

温度转换的计算公式:C=5×(F32)/9,其中:C表示摄氏温度,F表示华氏温度。

输入格式:

在一行中输入2个整数,分别表示lowerupper的值,中间用空格分开。

输出格式:

第一行输出:"fahr celsius"

接着每行输出一个华氏温度fahr(整型)与一个摄氏温度celsius(占据6个字符宽度,靠右对齐,保留1位小数)。

若输入的范围不合法,则输出"Invalid."。

输入样例1:

32 35
 

输出样例1:

fahr celsius
32   0.0
34   1.1
 

输入样例2:

40 30
 

输出样例2:

Invalid.

 1 #include <stdio.h>
 2 void chan(int l, int u);
 3 void inpu(int l, int u);
 4 int main(void)
 5 {
 6     int l,u;
 7     scanf("%d %d",&l,&u);
 8     if(l>u || u > 100 )
 9     {
10         printf("Invalid.");
11         return 0;
12     }
13     else
14     {
15         printf("fahr celsius\n");
16     }
17     chan(l,u);
18     return 0;
19 }
20 void chan(int l, int u)
21 {
22     double c = 0;
23     for(int f = l; f<=u; f+=2)
24     {
25         c = 5.0 * (f - 32) / 9;
26         printf("%d%6.1lf\n",f,c);
27     }
28 }

 求n个奇数分之一序列和

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

23
 

输出样例:

sum = 2.549541


 1 #include <stdio.h>
 2 void sum(int n);
 3 int main(void)
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     if(n <= 0)
 8     {
 9         return 0;
10     }
11     sum(n);
12     return 0;
13 }
14 void sum(int n)
15 {
16     double s = 0;
17     for(int i = 1; i<=n; i++)
18     {
19         s += 1.0/(2*i-1); 
20     }
21     printf("sum = %.6lf\n",s);
22 }

 

posted on 2023-04-21 13:27  在野武将  阅读(43)  评论(0编辑  收藏  举报