华师一附中OI组
标题:
求3的N次方
[打印本页]
作者:
diggersun
时间:
2014-11-1 14:09
标题:
求3的N次方
标准程序:
#include <iostream>
using namespace std;
int a[100]; //定义了a[0]***a[9]共10个元素
int i,j,k;
int x;
int main()
{
a[0]=1; //乘法默认的初值是1
for (k=0; k<=99; k++) //做 100次连乘
{
for (i=0; i<=99; i++) a[i]=a[i]*3; //每位数字都乘法
for (i=0; i<=98; i++) //进位 标程
{
x=a[i];
a[i]=x%10;
a[i+1]=a[i+1]+x/10;
}
}
j=99;
while ((a[j]==0) && (j>0)) j--;
for (i=j; i>=0; i--) cout<<a[i];
}
复制代码
作者:
clivia
时间:
2014-11-1 14:11
我什么都不说了。(语言意味上)
作者:
diggersun
时间:
2014-11-1 14:15
有人说,老师,初值设为3,减少一次乘法,
Mr Sun:可行,意义不大。
有人说,老师,我每次乘以27,减少大约2/'3乘法,
Mr Sun:可行,代码会变复杂,可以考虑。
有人说,老师,每次乘法里面又有100次此小乘法和100次进位,其实大多数情况下,前面都是0,可以考虑优化
Mr Sun: U R Very Clever!!!我们增加一个变量,记录有效位数,在此位数之后的都有效,前面的都是0.
shaonian: 其实我一般不用这样的方法,因为*****
Mr Sun: 学习和解决问题是不一样的!!
作者:
diggersun
时间:
2014-11-1 14:20
改进后的程序
#include <iostream>
using namespace std;
int a[100]; //定义了a[0]***a[9]共10个元素
int i,j,k;
int l;
int x;
int main()
{
a[0]=1;
l=0; //乘法默认的初值是1
for (k=0; k<=99; k++) //做 100次连乘
{
for (i=0; i<=l; i++) a[i]=a[i]*3; //每位数字都乘法
for (i=0; i<=l-1; i++) //进位 标程
{
x=a[i];
a[i]=x%10;
a[i+1]=a[i+1]+x/10;
}
if (a[l]>=10)
{
x=a[l];
a[l]=x%10;
a[l+1]=a[l+1]+x/10;
l++;
}
}
for (i=l; i>=0; i--) cout<<a[i];
return 0;
}
复制代码
作者:
diggersun
时间:
2014-11-1 14:29
更好的做法当然是快速幂,但是这个太难,以后再讲。
现在我们修改这个程序做100!
作者:
hr567
时间:
2014-11-1 22:39
本帖最后由 hr567 于 2014-11-1 22:50 编辑
改两句话就够了……
#include <iostream>
using namespace std;
int a[100];
int i,j,k;
int l;
int x;
int main()
{
a[0]=1;
l=0;
for (k=1; k<=100; k++)
{
for (i=0; i<=l; i++) a[i]=a[i]*k;
for (i=0; i<=l-1; i++)
{
x=a[i];
a[i]=x%10;
a[i+1]=a[i+1]+x/10;
}
while (a[l]>=10)
{
x=a[l];
a[l]=x%10;
a[l+1]=a[l+1]+x/10;
l++;
}
}
for (i=l; i>=0; i--) cout<<a[i];
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2