5-38 数列求和-加强版 (20分)
2016-05-14 19:04
323 查看
给定某数字AA(1\le
A\le 91≤A≤9)以及非负整数NN(0\le
N\le 1000000≤N≤100000),求数列之和S
= A + AA + AAA + \cdots + AA\cdots AS=A+AA+AAA+⋯+AA⋯A(NN个AA)。例如A=1A=1, N=3N=3时,S
= 1 + 11 + 111 = 123S=1+11+111=123。
输入数字AA与非负整数NN。
输出其NN项数列之和SS的值。
这道题有两种思路:
1.大数的求和问题:
//5-38 数列求和-加强版
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[10000005],b[10000005],back[10000005];
void add()
{
int i,j,k,up,x,y,z,l;
char *c;
if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;
c=(char *) malloc(l*sizeof(char));
i=strlen(a)-1;
j=strlen(b)-1;
k=0;up=0;
while(i>=0||j>=0)
{
if(i<0) x='0'; else x=a[i];
if(j<0) y='0'; else y=b[j];
z=x-'0'+y-'0';
if(up) z+=1;
if(z>9) {up=1;z%=10;} else up=0;
c[k++]=z+'0';
i--;j--;
}
if(up) c[k++]='1';
i=0;
c[k]='\0';
for(k-=1;k>=0;k--)
back[i++]=c[k];
back[i]='\0';
}
int main()
{
int A,N;
scanf("%d%d",&A,&N);
if(N==0) printf("0\n");
else
{
int f=A;
sprintf(a,"%d",0);
sprintf(b,"%d",A);
for(int i=0;i<N;i++)
{
add();
int j;
for( j=0;back[j]!='\0';j++)
a[j]=back[j];
a[j]='\0';
for(j=0;b[j]!='\0';j++);
b[j]=A+'0';b[j+1]='\0';
}
puts(back);
}
return 0;
}
这样做的结果只有16分,最后两组数据超时
法二:成功AC
#include <stdio.h>
#include <string.h>
#include <math.h>
int num[1000000];
int main()
{
int A;
int N;
int i;
int j;
int t;
int flag;
scanf("%d%d",&A,&N);
if(N == 0)
printf("0\n");
else
{
flag = 0;
for(i=N, j=0; i>=1; i--, j++)
{
t = A*i + flag;
flag = t / 10;
num[j] = t % 10;
}
if(flag > 0)
{
num[j] = flag;
j++;
}
for(i=j-1; i>=0; i--)
{
printf("%d",num[i]);
}
}
return 0;
}
思路如下:
/*
进位flag 个位
99999 9*5+0=45 4 5
9999 9*4+4=40 4 0
999 9*3+4=31 3 1
99 9*2+3=21 2 1
+ 9 9*1+2=11 1 1
flag>=1,需要前进以为为flag;
---------
*/
A\le 91≤A≤9)以及非负整数NN(0\le
N\le 1000000≤N≤100000),求数列之和S
= A + AA + AAA + \cdots + AA\cdots AS=A+AA+AAA+⋯+AA⋯A(NN个AA)。例如A=1A=1, N=3N=3时,S
= 1 + 11 + 111 = 123S=1+11+111=123。
输入格式:
输入数字AA与非负整数NN。
输出格式:
输出其NN项数列之和SS的值。
输入样例:
1 3
输出样例:
123
这道题有两种思路:
1.大数的求和问题:
//5-38 数列求和-加强版
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[10000005],b[10000005],back[10000005];
void add()
{
int i,j,k,up,x,y,z,l;
char *c;
if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;
c=(char *) malloc(l*sizeof(char));
i=strlen(a)-1;
j=strlen(b)-1;
k=0;up=0;
while(i>=0||j>=0)
{
if(i<0) x='0'; else x=a[i];
if(j<0) y='0'; else y=b[j];
z=x-'0'+y-'0';
if(up) z+=1;
if(z>9) {up=1;z%=10;} else up=0;
c[k++]=z+'0';
i--;j--;
}
if(up) c[k++]='1';
i=0;
c[k]='\0';
for(k-=1;k>=0;k--)
back[i++]=c[k];
back[i]='\0';
}
int main()
{
int A,N;
scanf("%d%d",&A,&N);
if(N==0) printf("0\n");
else
{
int f=A;
sprintf(a,"%d",0);
sprintf(b,"%d",A);
for(int i=0;i<N;i++)
{
add();
int j;
for( j=0;back[j]!='\0';j++)
a[j]=back[j];
a[j]='\0';
for(j=0;b[j]!='\0';j++);
b[j]=A+'0';b[j+1]='\0';
}
puts(back);
}
return 0;
}
这样做的结果只有16分,最后两组数据超时
法二:成功AC
#include <stdio.h>
#include <string.h>
#include <math.h>
int num[1000000];
int main()
{
int A;
int N;
int i;
int j;
int t;
int flag;
scanf("%d%d",&A,&N);
if(N == 0)
printf("0\n");
else
{
flag = 0;
for(i=N, j=0; i>=1; i--, j++)
{
t = A*i + flag;
flag = t / 10;
num[j] = t % 10;
}
if(flag > 0)
{
num[j] = flag;
j++;
}
for(i=j-1; i>=0; i--)
{
printf("%d",num[i]);
}
}
return 0;
}
思路如下:
/*
进位flag 个位
99999 9*5+0=45 4 5
9999 9*4+4=40 4 0
999 9*3+4=31 3 1
99 9*2+3=21 2 1
+ 9 9*1+2=11 1 1
flag>=1,需要前进以为为flag;
---------
*/
相关文章推荐
- linux驱动模板
- web.xml详解
- HDU 1060 Leftmost Digit(求 n ^ n 的最高位的值)
- 安卓6.0适配问题 (主华为 p7 p8)
- Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构
- 常见的机器学习&数据挖掘知识点
- BZOJ 1013 [JSOI2008]球形空间产生器sphere
- cardView没有水波纹效果
- Java 反射机制(一)
- k-近邻法用于手写识别系统
- DEDECMS之四 栏目调用
- 对象学习(一)
- RadioGroup控件与radioBtton控件
- PHP之——在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持。
- hdu 1262 寻找素数对(素数的判断,快速筛选素数)
- 消息摘要算法-SHA
- 笔试题55. LeetCode OJ (42)
- Leetcode:87. Scramble String
- 关于json对象和数组的访问的一些问题
- 快速查找注入点(转)