这个题目令我印象深刻,初见的时候用的int,老师给出的测试数据是非常非常大的数位(手下留情啊~),直接堵死了方法一
方法二的做法是把22222+2222+222.......看成一个个单独的数位上的数字,当输入的n为5时,最后一位是5个2相加,前一位是4个........定义进位和取余的函数,便于操作。
#include <math.h>
#include <stdio.h>
/*int main() { //方法1 用longlong尽可能提供多的位数,最普通的直接加减,输入的数字过大则无法计算
long long a = 0, b = 2, c, d, e, n;
scanf("%lld", &n);
for (; n > 0; n--) {
a += b;
b *= 10;
b = b + 2;
}
printf("%lld", a);
}
*/
int jinwei(int
n) { //方法2 定义一个一维数组,储存各个位数的值,用进位和取余,随便输入都能计算,不考虑溢出
int a, i = 0;
a = n ;
if (a > 9) {
a /= 10;
return a;
} else
return 0;
}
int quyu(int n) {
int a, i = 0;
a = n;
return a %= 10;
}
int main() {
int b = 2, c, d, e, n; //这里讨论的是2222这种形式,所以设了个b=2,可以改成scanf输入
scanf("%d", &n);
int a[101] = {0}, g[101] = {0};
for (c = n; c > 0; c--) {
a[c + 100 - n] = 2 * c;
}
for (d = 100; d > 0; d--) {
g[d] = quyu(a[d]);
}
for (d = 100; d > 0; d--) {
g[d - 1] += jinwei(a[d]);
a[d - 1] += jinwei(a[d]);
}
for (d = 0; d <= 100; d++) {
if (g[d] != 0) {
while (d <= 100) {
printf("%d", g[d++]);
}
}
}
}
这种计算方式真是让人梦回小学。