5-38 数列求和-加强版 (20分)
给定某数字AAA(1≤A≤91\le A\le 91≤A≤9)以及非负整数NNN(0≤N≤1000000\le N\le 1000000≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯AS = A + AA + AAA + \cdots + AA\cdots AS=A+AA+AAA+⋯+AA⋯A(NNN个AAA)。例如A=1A=1A=1,N=3N=3N=3时,S=1+11+111=123S = 1 + 11 + 111 = 123S=1+11+111=123。
输入格式:
输入数字AAA与非负整数NNN。
输出格式:
输出其NNN项数列之和SSS的值。
输入样例:
1 3
输出样例:
123
解答程序:
方法一:(原创)
#include<stdio.h>
#define fun x*Aint main(void)
{
int i,x,N,b,A,j;
scanf("%d %d",&A,&N);//N代表多少个数字,A代表数字;
int num[1000001]={0}; //不要问我为什么不用可变数组:int num[N+1],也不要问我为什么要用100万的数组;
//不用可变数组的原因是:在线测试的编译器跟我使用DEV C++不同,无法编译;100万的数组是因为,没有这么长会一直显示段错误;
int flag; //只是为了方便显示 x*A,
i=0;
if(N==0) {
printf("0\n");
return 0;
}
for(x=N;x>=1;x--) {
b=i;
flag=fun;
while(flag!=0) {
num[i]=flag%10+num[i]; //加上后面数字的进位值,num[i]开始初始化为0
if(num[i]>=10) { // 判断是否有进位
num[i]=num[i]%10;
num[i+1]+=1;
}
flag=flag/10;
i++; //数组下标值加1;
if(flag==0) {
i=b; //b的作用是为了记录flag循环时i的值,出去的时候再返回;
}
}
i++;
}
i=1000000;
while(num[i]==0) { //如果数组过长,就要先把数组下标值移动到不为0的位置,最后输出;
i--;
}
for(j=i;j>=0;j--) {
printf("%d",num[j]);
}
printf("\n");
return 0;
}
方法二:(非原创,有改进)
<code class="hljs perl has-numbering"><span class="hljs-keyword">int</span> main() { <span class="hljs-keyword">int</span> A; <span class="hljs-keyword">int</span> N; <span class="hljs-keyword">int</span> i; <span class="hljs-keyword">int</span> j; <span class="hljs-keyword">int</span> t; <span class="hljs-keyword">int</span> flag; <span class="hljs-keyword">int</span> num[<span class="hljs-number">1000000</span>]; scanf(<span class="hljs-string">"<span class="hljs-variable">%d</span><span class="hljs-variable">%d</span>"</span>,&A,&N); <span class="hljs-keyword">if</span>(N == <span class="hljs-number">0</span>) <span class="hljs-keyword">printf</span>(<span class="hljs-string">"0\n"</span>); <span class="hljs-keyword">else</span> { flag = <span class="hljs-number">0</span>; <span class="hljs-keyword">for</span>(i=N, j=<span class="hljs-number">0</span>; i>=<span class="hljs-number">1</span>; i--, j++) { t = A<span class="hljs-variable">*i</span> + flag; //flag为进位标志 </code><pre name="code" class="prettyprint"><code class="hljs perl has-numbering"> num[j] = t % <span class="hljs-number">10</span>; //每一次只保存一位数字</code>
<code class="hljs perl has-numbering"> flag = t / <span class="hljs-number">10</span>; </code>} if(flag > 0) //在N,A都大的时候,最后一位可能会有进位,所以要注意: { num[j] = flag; j++; } for(i=j- 1; i>= 0; i--) { printf( "%d",num[i]); } } return 0; }