C 练习实例18
题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字,例如 2+22+222+2222+22222 (此时共有5个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值。
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
int main() {
int sum = 0; // 存储结果的变量
int base, terms; // base 为 a 的值,terms 为 n 的值
int temp; // 临时变量,用于计算当前项的值
// 提示用户输入值
printf("请输入整数 a 和 n(例如 2 和 5):\n");
scanf("%d%d", &base, &terms);
// 初始化 temp 为 a
temp = base;
// 通过循环计算 a + aa + aaa + ...
while (terms > 0) {
sum += temp; // 累加当前项
base *= 10; // base 每次左移一位(例如 2 -> 20 -> 200)
temp += base; // 更新 temp,使其变为下一项
terms--; // 减少剩余项数
}
// 输出结果
printf("计算结果为:%d\n", sum);
return 0;
}
以上实例输出结果为:
请输入整数 a 和 n(例如 2 和 5): 2 5 计算结果为:24690
使用递归实现:
实例
#include <stdio.h>
// 递归函数,用于计算每一项的值
int calculate_term(int count, int base);
int main() {
int count; // 总项数
int base; // 初始值
int sum = 0; // 累加结果
// 提示用户输入初始值和总项数
printf("请输入初始值 (a):");
scanf("%d", &base);
printf("请输入项数 (n):");
scanf("%d", &count);
// 校验输入的合法性
if (count <= 0 || base <= 0) {
printf("输入的初始值和项数必须为正整数!\n");
return 1; // 返回错误状态
}
// 通过循环累加每一项
for (int i = 1; i <= count; i++) {
sum += calculate_term(i, base); // 调用递归函数计算第 i 项的值
}
// 输出最终结果
printf("计算结果为:%d\n", sum);
return 0;
}
// 递归函数,计算当前项的值
int calculate_term(int count, int base) {
if (count == 1) {
return base; // 递归终止条件:第一项直接返回 base
} else {
// 递归计算:当前项等于上一项乘以 10 加上 base
return calculate_term(count - 1, base) * 10 + base;
}
}
// 递归函数,用于计算每一项的值
int calculate_term(int count, int base);
int main() {
int count; // 总项数
int base; // 初始值
int sum = 0; // 累加结果
// 提示用户输入初始值和总项数
printf("请输入初始值 (a):");
scanf("%d", &base);
printf("请输入项数 (n):");
scanf("%d", &count);
// 校验输入的合法性
if (count <= 0 || base <= 0) {
printf("输入的初始值和项数必须为正整数!\n");
return 1; // 返回错误状态
}
// 通过循环累加每一项
for (int i = 1; i <= count; i++) {
sum += calculate_term(i, base); // 调用递归函数计算第 i 项的值
}
// 输出最终结果
printf("计算结果为:%d\n", sum);
return 0;
}
// 递归函数,计算当前项的值
int calculate_term(int count, int base) {
if (count == 1) {
return base; // 递归终止条件:第一项直接返回 base
} else {
// 递归计算:当前项等于上一项乘以 10 加上 base
return calculate_term(count - 1, base) * 10 + base;
}
}
以上实例输出结果为:
请输入初始值 (a):2 请输入项数 (n):5 计算结果为:24690
C 语言经典100例
Juanjuan
m18***100031@163.com
参考方法:
#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; }Juanjuan
m18***100031@163.com
Zayn
267***5830@qq.com
参考代码:
思路:利用了数列的一些找规律的方法
#include<stdio.h> #include<math.h> //将计算过程分到了两个函数,其实可以合并,很简单 double f16_step1(int number,int n){ int i=0; double temp1=number/9.0;//计算中间转换分数 double temp2=(pow(10,n)-1)*temp1; printf("%lf\t",temp2); return temp2; } void f16_step2(int number,int n){ int i; double sum=0; for(i=1;i<=n;i++){ sum+=f16_step1(number,i); } printf("sum=%lf\n",sum); } //在主函数中调用f16_step2()即可,修改一下输入和输出,让代码更友好 int main() { f16_step2(2,5); }Zayn
267***5830@qq.com
HOWU
496***917@qq.com
参考方法:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> //给数组分配动态内存 int *get_number(int all){ int *temp_number = NULL; //分配空间 temp_number = (int *)malloc((all + 1) * sizeof(int)); if (temp_number == NULL) { fprintf(stderr, "temp_number malloc err\n"); return NULL; } //初始化 memset(temp_number, 0, (all + 1) * sizeof(int)); return temp_number; } //释放分配空间 void free_number(int *number){ if (number == NULL) { return; } free(number); number = NULL; return; } int main(void){ int all = 0, num = 0; int count = 0; int s = 0; int *number = NULL; printf("几个数相加?什么数?\n"); scanf("%d %d", &all, &num); number = get_number(all); for (count = 0; count < all; count++) { number[count] += num; s += number[count]; number[count + 1] = number[count] * 10; } number[all] = '\0'; for (count = 0; count < (all - 1); count++) { printf("%d + ", number[count]); } printf("%d = %d\n", number[count], s); free_number(number); return 0; }HOWU
496***917@qq.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> long N_A(int a,int n); int main(void) { int a,n; printf("请输入 a 和 n:\n"); scanf("%d%d",&a,&n); printf("a+aa+...=%ld",N_A(a,n)); return 0; } long N_A(int a,int n) { long sum = 0; long temp = a; while(n) { sum += temp; temp = temp*10 + a; n--; } return sum; }HIT_CCC
117***2963@qq.com
ronnyz
221***8677@qq.com
参考方法:
#include <stdio.h> int main(){ int sum=0,a,n,temp; while(scanf("%d%d",&a,&n)!=EOF){ temp=a; while(n--){ sum+=temp; temp=temp*10+a; } printf("sum=%d\n",sum); } return 0; }ronnyz
221***8677@qq.com
kisushotto
kis***otto@163.com
使用递归方法:
#include <stdio.h> #include <math.h> int sumN(int a, int i);//返回i个a int main() { int sum = 0, a, n, i; printf("请输入 a 和 n:\n"); scanf("%d %d", &a, &n); for (i = 1; i <= n; ++i) { sum += sumN(a,i); } printf("a+aa+...=%d", sum); return 0; } int sumN(int a, int i) { if (i >= 1) return sumN(a, i - 1) + a*pow(10,i-1); else return 0; }kisushotto
kis***otto@163.com
金色葵花菜籽
122***814@qq.com
利用等比数列求和:
#include <stdio.h> #include <math.h> int main() { int n, a; printf("Input a & n:\n"); scanf("%d %d", &a, &n); int sum = 0; // n为几,最大数的位数就为几 while (n != 0) { // 利用等比数列求和公式计算每个数字出现的次数 sum += (pow(10, n) - 1) / 9; n--; } // 输出最终的乘积结果 printf("The sum is %d\n", a * sum); return 0; }金色葵花菜籽
122***814@qq.com