C语言实例_16之求不同位数为同一个数的和
1. 题目
求 s = a + a a + a a a + a a a a + a a . . . a s = a + aa + aaa + aaaa + aa...a s=a+aa+aaa+aaaa+aa...a的值,其中 a a a是一个数字,相加的项数由键盘输入控制,例如当 a = 2 a = 2 a=2,项数为 5 5 5时,就是求 2 + 22 + 222 + 2222 + 22222 2 + 22 + 222 + 2222 + 22222 2+22+222+2222+22222的值。
2. 分析
- 需要从键盘获取两个信息,一个是数字 a a a的值,另一个是相加的项数 n n n。
- 然后通过循环来依次生成每一项的值并累加起来得到总和 s s s。在生成每一项时,可以利用上一项的值来构建下一项。例如,已知当前项为 a a a aaa aaa,那么下一项 a a a a aaaa aaaa就可以通过将当前项乘以 10 10 10再加上 a a a得到。
3. 实例代码
#include <stdio.h>
#include <math.h>
int main() {
int a, n;
printf("请输入数字a的值:");
scanf("%d", &a);
printf("请输入相加的项数n:");
scanf("%d", &n);
int sum = 0;
int term = 0;
for (int i = 1; i <= n; i++) {
term = term * 10 + a;
sum += term;
}
printf("s的值为:%d\n", sum);
return 0;
}
4. 输出结果
假设输入数字 a a a的值为 3 3 3,相加的项数 n n n为 4 4 4,则程序运行后的输出结果如下:
请输入数字a的值:3
请输入相加的项数n:4
s的值为:3702
根据输入的 a = 3 a = 3 a=3和 n = 4 n = 4 n=4,通过程序计算得到了 s = 3 + 33 + 333 + 3333 = 3702 s = 3 + 33 + 333 + 3333 = 3702 s=3+33+333+3333=3702的值。
5. 递归实现
- 递归思路:
- 使用递归计算这个式子的值,可以把整个式子的求和看成是一个递归问题。可以将式子拆分成多个部分,每一部分都可以通过递归的方式来计算。
- 对于第n项的值,可以看作是第n-1项的值乘以10再加上a。例如,第三项aaa,它的值就等于第二项aa的值乘以10再加上a。
- 整个式子的和s,就是第n项的值加上前n-1项的和,这个前n-1项的和又可以通过递归调用函数自身来计算。
- 递归终止条件:
- 当项数为1时,也就是只需要计算第一项的值,此时返回a即可,这就是递归的终止条件。
#include <stdio.h>
// 递归函数用于计算每一项的值
int calculateTerm(int a, int n) {
if (n == 1) {
return a;
} else {
return calculateTerm(a, n - 1) * 10 + a;
}
}
// 递归函数用于计算式子的总和
int calculateSum(int a, int n) {
if (n == 1) {
return a;
} else {
return calculateTerm(a, n) + calculateSum(a, n - 1);
}
}
int main() {
int a, n;
printf("请输入数字a的值:");
scanf("%d", &a);
printf("请输入相加的项数n:");
scanf("%d", &n);
int sum = calculateSum(a, n);
printf("s的值为:%d\n", sum);
return 0;
}
可以将以上俩递归函数合并为一个:
通过增加isSum
参数巧妙地实现了在一个函数中既可以计算每一项的值,又可以计算总和的功能。
#include <stdio.h>
// 合并后的递归函数
int calculate(int a, int n, int isSum) {
if (n == 1) {
return a;
}
int currentTerm;
if (!isSum) {
// 计算当前项的值
currentTerm = calculate(a, n - 1, false) * 10 + a;
return currentTerm;
} else {
// 计算总和
int currentSum = calculate(a, n, false) + calculate(a, n - 1, true);
return currentSum;
}
}
int main() {
int a, n;
printf("请输入数字a的值:");
scanf("%d", &a);
printf("请输入相加的项数n:");
scanf("%d", &n);
int sum = calculate(a, n, true);
printf("s的值为:%d\n", sum);
return 0;
}
6. 算法库实现
#include<stdio.h>
#include<math.h>
int main()
{
int i, a, n, sum=0;
printf("请输入 a 和 n:\n");
scanf("%d%d", &a, &n);
for(i=0; i<n; i++)
{
sum += a*pow(10, i)*(n-i);
}
printf("sum is %d\n", sum);
return 0;
}
以输入 a = 2
,n = 3
为例,解释:
循环会执行三次(因为 i
从 0
开始,每次递增 1
,直到 i < n
,即 i < 3
),下面分别分析每次循环的计算过程:
- 第一次循环(
i = 0
):
- 此时进入循环体,计算
a*pow(10, i)*(n - i)
的值:- 首先计算
pow(10, i)
,因为i = 0
,所以pow(10, 0)
等于1
(任何非零数的0
次幂都为1
)。 - 然后计算
a*pow(10, i)
,已知a = 2
,那么a*pow(10, i)
就等于2 * 1 = 2
。 - 最后计算
a*pow(10, i)*(n - i)
,因为n = 3
,所以(n - i)
等于3 - 0 = 3
,那么整个式子的值就是2 * 3 = 6
。
- 首先计算
- 将这个值累加到
sum
中,此时sum
初始值为0
,累加后sum = 0 + 6 = 6
。
- 第二次循环(
i = 1
):
- 再次进入循环体,重新计算
a*pow(10, i)*(n - i)
的值:- 先算
pow(10, i)
,由于i = 1
,所以pow(10, 1)
等于10
。 - 接着算
a*pow(10, i)
,a = 2
,则a*pow(10, i)
变为2 * 10 = 20
。 - 最后算
a*pow(10, i)*(n - i)
,n = 3
,此时(n - i)
等于3 - 1 = 2
,所以整个式子的值为20 * 2 = 40
。
- 先算
- 把这个值累加到
sum
中,之前sum = 6
,现在累加后sum = 6 + 40 = 46
。
- 第三次循环(
i = 2
):
- 又一次进入循环体,继续计算
a*pow(10, i)*(n - i)
的值:- 先求
pow(10, i)
,因为i = 2
,所以pow(10, 2)
等于100
。 - 再求
a*pow(10, i)
,a = 2
,那么a*pow(10, i)
就是2 * 100 = 200
。 - 最后求
a*pow(10, i)*(n - i)
,n = 3
,(n - i)
等于3 - 2 = 1
,所以整个式子的值为200 * 1 = 200
。
- 先求
- 将这个值累加到
sum
中,原先sum = 46
,累加后sum = 46 + 200 = 246
。
经过这三次循环后,循环结束,此时 sum
的值就是按照式子 s = a + aa + aaa + aaaa + aa...a
(这里是 2 + 22 + 222
)计算得到的总和,即 246
。