C程序写求7的34次方的值 (注意整型表示长度范围)

\u8bd5\u6bd4\u8f833\u7684555\u6b21\u65b9,4\u7684444\u6b21\u65b9,5\u7684333\u6b21\u65b9\u7684\u5927\u5c0f? \u8c01\u80fd\u544a\u8bc9\u6211\u7b54\u6848\u548c\u8fc7\u7a0b

3\u7684555\u6b21\u65b9=\uff083\u76845\u6b21\u65b9\uff09\u7684111\u6b21\u65b9=243\u7684111\u6b21\u65b9
4\u7684444\u6b21\u65b9=(4\u76844\u6b21\u65b9)\u7684111\u6b21\u65b9=256\u7684111\u6b21\u65b9
5\u7684333\u6b21\u65b9=(5\u76843\u6b21\u65b9)\u7684111\u6b21\u65b9=125\u7684111\u6b21\u65b9
\u6240\u4ee55\u7684333\u6b21\u65b9<3\u7684555\u6b21\u65b9<4\u7684444\u6b21\u65b9

5\u768450\u6b21\u65b9=5\u5e73\u65b9\u768425\u6b21\u65b9=25\u768425\u6b21\u65b9\u5927\u4e8e24\u768425\u6b21\u65b9
\u5b8c\u6bd5

参见我对同一问题的回答:
http://zhidao.baidu.com/question/292814064.html?an=0&si=1
为节约时间和空间,该算法没有进行进制转换,如果要求转话为十进制,需要另外些转化函数。可参见计算机代数方面的书籍。
也可以直接按十进制逐位计算——时间开销和空间开销都会最大。
比如http://zhidao.baidu.com/question/173289539.html?an=0&si=2

用多个整形数来表示结果的高位和低位。
比如,对于32位的运算器,一个int类型的数据有32位,占用4个字节(byte),最大可以表示2^32-1=4294967295≈4.3×10^9(这里只考虑正数,可取无符号型)。
查对数表知,log_10(7)≈0.8451,34*log_10(7)≈28.7,故7^34≈t*10^28,
28>9*3,故大概需要用4个无符号整形变量来保存最后结果。
(如果更精细一点,查得log_10(2)≈0.3010,由换底公式,log_2(7)=log_10(7)/log_10(2)≈2.81,34*log_2(7)≈95.5,95.5/32≈3,故至少需要3个无符号整形变量来存储最后结果,用4个来存储不会有问题。)

至于计算,为简化计算,需要使用更多的整形变量来存储结果。因为7=(111)_2,需要占用三个字节,为免计算时溢出,每个无符号整形变量尽量只使用后面29位(32-3=29),这样,乘以7(占用三位)之后,才不会超过32位。为了避免符号位的讨论,这里只使用后面28位。

确定好数据结构之后,再来说大题思路。

把第一个变量(共四个变量)置为7,第2~4个变量置为0。然后第一个变量不断自乘7,但当第一个变量的第2~4为位(前面,高位)不为0时,把这三位的数据放在第二个无符号变量中;然后再乘以7(两个变量都要乘以7),如此反复。当第二个变量的第2~4为不为0时,把这三位的数据放在第三个无符号变量中;然后再乘以7(三个变量都要乘以7),如此往复。当第三个变量的第2~4为不为0时,把这三位的数据放在第四个无符号变量中,然后再乘以7(四个变量都要乘以7),如此往复,直到自乘33次为止。
如果是两个比较大的数相乘,稍微复杂一点,可以参阅《计算机代数》方面的书籍。

一个程序如下:

# include<stdio.h>
main()
// This program will calculate power(7, 34) without excuting the functions in math.h.
// 0x4736 is an hexadecimal number, which means 4*power(16,3)+7*power(16,2)+3*power(16,1)+6*power(16,0);
{ int A[4], c=0x70000000, i=0, j, b;
A[3]=7;
for (j=0; j<3; j++) A[j]=0;
while(i<9) { A[3]*=7; i++; }
printf("\n A[3]=%x.", A[3]);
while(i<34)
{ A[0]*=7;
for(j=1; j<4; j++)
{ A[j]*=7;
b=((unsigned)A[j])>>28;
if (b>0)
{ A[j-1]+=b;
A[j]=A[j]&0x0FFFFFFF;
}
}
i++;
}
printf("\n The result of power(7,34) is : ");
for(j=0; j<4; j++) printf("%x", A[j]);
}
在windows7系统通过gcc编译,运行后的结果是:
The result of power(7,34) in hexadecimal system is : aedc7f313b85d3ed29cc4b31

这里直接以16进制输出,减少了转换。如果要以10进制输出,还需要另外写转换语句。

为进行检验,用maple算出7^34=54116956037952111668959660849;
将其转化为16进制数:convert(54116956037952111668959660849, hex);
结果为:AEDC7F313B85D3ED29CC4B31,
与C程序算出的结果相同。

将C程序算出的结果转化为10进制:
convert("aedc7f313b85d3ed29cc4b31", decimal, hex)
结果为:54116956037952111668959660849,
与maple计算的结果相同。

如果以power()函数来运算,由于是浮点运算,有效数字没有那么多(32位系统中,双精度浮点数也是用4个字节存储)

#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[100]={1},len=1;
int i,j,t;
for(i=0;i<4;i++)
{
t=0;
for(j=0;j<len;j++)
{
int p=a[j]*7+t;
a[j]=p%10;
t=p/10;
}
if(t)
{
a[j]=t;
len++;
}
}
t=0;
for(i=len-1;i>=0;i--)
{
t++;
if(t%4==0)printf(",");
printf("%d",a[i]);
}
}

扩展阅读:求解方程计算器 ... 次方的计算公式大全 ... 次方计算器 ... 功能计算器 ... 电脑怎么自己重装系统 ... 3的次方对照表 ... 万能计算器 ... 怎么用u盘重装系统 ... 二十四点计算器 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网