综述:
本题只有一个难点,就是当N非常大的时候,比如N取100000而a取9,这将是一个非常大的数,int、long、long long 我都试过,都存不下,这个时候只能将最后和的数一位一位的往数组中存,N的最大值为100000,那么最后和最大为1000000位,我们用个1000000的数组就能存下最后的结果,那么具体怎么用数组对其操作呢?下文将详细讲述此过程。
目录
题目:
给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
输入样例:
1 3
输出样例:
123
解题思路:
我们为了能存下一个超大的数,会采用数组进行存储,用数组存储按位存储,一位一位的存进去,先是个位,然后是10位、百位、千位..... 具体操作如下图所示:
程序实现:
有了解题思路,程序实现起来就容易了,具体分为以下几个部分
1、如果a==0或者n==0,最后的结果为0,直接输出0
2、输入N,写个循环,循环N次,第一次进入循环的时候直接将N个A相加然后取个位,就是最后结果的个位,存储到数组的0位置。将进位存储到临时变量tmp中。
3、之后进入循环,需要加上进位之后的结果再取个位。
4、当到了n位时,也就是存储到数组的n-1位时需要注意一个点,就是这次的运算是否产生了进位,我用了一个标志位判断,如果产生了进位,需要在数组的n位置写入一个1。
5、打印,也是需要判断一下最后结果是N位还是N+1位。通过第四步的标志位判断。
AC代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 0;
int n = 0;
scanf("%d%d", &a, &n);
int flag = 0;
int tmp = 0;
int* num = (int*)malloc(sizeof(int) * (n + 1));
if (a == 0||n==0)
{
printf("0");
}
else
{
for (int i = 0; i < n; i++)
{
if (i == 0)
{
num[i] = a * (n - i) % 10;
}
else
{
num[i] = (a * (n - i) % 10 + tmp)%10;
}
tmp = (a * (n - i) + tmp) / 10;
if (i == n - 1 && tmp != 0)
{
num[n] = 1;
flag = 1;
}
}
}
if (flag == 1)
{
for (int i = n; i >= 0; i--)
{
printf("%d", num[i]);
}
}
else
{
for (int i = n-1; i >= 0; i--)
{
printf("%d", num[i]);
}
}
return 0;
}
提交结果:
总结:
难度不是很难,但是需要想到一个点,就是每一位怎么去计算,这个地方想到了这个题就OK啦.