计算阶乘和
对于给定的正整数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<m≤n≤10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子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!(n−m)!n!算出从n个不同元素中取出m个元素(m≤n)的组合数。
建议定义和调用函数fact(n)
计算n!
,其中n
的类型是int
,函数类型是double
。
输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。
输出格式:
按照格式“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个正整数lower
和upper
(lower
≤upper
≤100),请输出一张取值范围为[lower
,upper
]、且每次增加2华氏度的华氏-摄氏温度转换表。
温度转换的计算公式:C=5×(F−32)/9,其中:C表示摄氏温度,F表示华氏温度。
输入格式:
在一行中输入2个整数,分别表示lower
和upper
的值,中间用空格分开。
输出格式:
第一行输出:"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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术