此问题来自Hacker Earth网站,如下所示
输入:第一行包含t,测试用例数。在那之后,每行包含一对空格分隔的整数,即a和b。
输出:对于每个测试用例,您需要在^ b中打印数字总和。
约束:
1·; = T< = 20000
1·; = A LT; = 100
1·; = b将= 1000
样本输入(明文链接)
5
2 10
3 3
5 2
2 7
100 1000
样本输出(明文链接)
7
9
7
11
1
说明:考虑第一个测试用例。 2 ^ 10 = 1024
Now, 1 + 0 + 2 + 4 = 7
So, output for this test case is 7.
现在我已按如下方式解决了这个问题:
#include<stdio.h>
#define test_max 20000
#define a_max 100
#define b_max 10000
long int power(int,int);
long int check_num(int,int);
int main()
{
int t;
long int i,rem,j=0,sum=0;
long int pr;
scanf("%d",&t);
int a[t],b[t];
for(i=0;i<t;i++)
{
scanf("%d",&a[i]);
scanf("%d",&b[i]);
if(a[i]>a_max||a[i]<=0||b[i]>b_max||b[i]<=0)
{
// printf("Please Check the Enter number limitation");
exit(0);
}
}
for(i=0;i<t;i++)
{
int check=0;
check=check_num(a[i],b[i]);
if(check==0)
{
pr=power(a[i],b[i]);
//printf("%d\t%d\t%ld\t",a[i],b[i],pr);
while(pr!=0)
{
rem=pr%10;
sum=sum+rem;
pr=pr/10;
}
printf("%d\n",sum);
sum=0;
}
else if(check==1)
{
printf("1\n");
}
}
return 0;
}
long int check_num(int a,int b)
{
if(a==100||a==10||a==1) return 1;
else return 0;
}
long int power(int n,int p)
{
int i;
long int num=n;
for(i=1;i<p;i++)
{
num=num*n;
}
return num;
}
但这不是一个完美的答案。有谁能告诉我如何解决这个问题?
此问题的链接位于:HERE
我知道100^1000
如果不使用任何库都是不可能的,我只需要避免这种情况,但是如何?
答案 0 :(得分:0)
答案 1 :(得分:0)
一般来说,当你谈论大数字时,你有3个主要选择:
1)使用操纵大数字的库
2)为大数字实现自己的功能(使用数组来存储数字 - 长度将等于数字位数)
3)查找数学方法
我将为3 rd 方法添加一些细节,因为1 st 和2 nd 并不是很复杂。
如果您只需要这些数字的总和,请尽量避免计算这个大数字。
在使用大数字时,请考虑对数及其properties。
例如,您的特定案例可以采用以下形式编写:
100^1000 = (10^2)^1000 = 10^(2*1000) * 1 = 10^2000 + 0 = 10^2000 * 1
你知道第一部分(10^2000
)只添加了一些零=&gt;它不会影响你的结果(总和)。因此,您可以尝试将这两个大数字分成两部分(一部分不影响总和,另一部分是总和 - 1
)。
如何使用对数来解决更普遍的问题?以下观察可以概括上面提到的事情:
a^x = 10^lg(a^x) = 10^(x*lg(a))
where lg = log in base 10
然后,您可以将您的号码写为:10^c * k
或10^c + k
或10^c - k
等,具体取决于您的号码。
这个解释只是为了指导,给你一个品味。但这个想法是一样的:在尝试其他方法之前,先考虑一些基于某些属性的数学解决方案。