2 jiankeabcd jiankeabcd 于 2016.05.06 18:47 提问

计算n位数为止的3的最大幂运算

对于一个正整数n(0<n<80),写一个输出n位数以内最大的3的幂运算

输入1
输出9

输入2
输出81

输入6
输出531441

输入60
输出436673502879206784130402698570834024654748577491697818855443

以下是我自己写的程序

 #include<stdio.h>
#include<string.h>

int main(void)
{
    int i,n,sum=1;
    char m[999]="1";
    scanf("%d",&n);
    for(i=1;;i++){
        if(strlen(m)>n)
            break;
        else
            sum=sum*3;
            sprintf(m,"%d",sum);
    }
    sum=sum/3;
    printf("%d\n",sum);
    return 0;
}

n=1~9的时候都没有问题,从10开始输出-346101685,大于10的时候开始不输出数值
求大神帮帮忙 谢谢!

2个回答

qq_34805680
qq_34805680   2016.05.06 19:38
已采纳

#include

int sum[61],num[61];

int main()
{
int n;
int i;
int l=1,val=0;
scanf("%d",&n);
num[0]=3;
while(l<=n)
{
for(i=0;i<l;i++)
{
sum[i]=num[i];
}

    for(i=0;i<l;i++)
    {
        num[i]=num[i]*3+val;
        val=num[i]/10;
        num[i]=num[i]%10;
    }
    if(val!=0) {
        num[i]=val;
        l=l+1;
        val=0;
    }
}
for(i=l-2;i>-1;i--)
    printf("%d",sum[i]);
printf("\n");
return 0;

}

wb_it_man
wb_it_man   2016.05.06 19:05

当你输入到10的时候,输出的数字超过了计算机内整形数据的存储范围。 计算机能够计算的数值也是有范围的,当结果很大时,计算机也是算不出来的。

所以解决这一类问题,你可以参考一下**大数相乘算法**,你的这个问题和大数相乘问题类似。

由于计算机无法存储这么大的数,所以你可以采用用字符串形式来表示这个数,然后还是照原来的运算规则,

 #include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  

#define N 100  

/* 
 *将在数组中保存的字符串转成数字存到int数组中 
*/  
void getdigits(int *a,char *s)  
{  
     int i;  
     char digit;  
     int len = strlen(s);  

     //对数组初始化  
     for(i = 0; i < N; ++i)  
           *(a + i) = 0;  
     for(i = 0; i < len; ++i){  
           digit = *(s + i);  
           *(a + len - 1 - i) = digit - '0';//字符串s="12345",因此第一个字符应该存在int数组的最后一个位置  
     }  
}  

/* 
 *将数组a与数组b逐位相乘以后存入数组c 
 */  
void multiply(int *a,int *b,int *c)  
{  
     int i,j;  

     //数组初始化  
     for(i = 0; i < 2 * N; ++i)  
           *(c + i) = 0;  
     /* 
      *数组a中的每位逐位与数组b相乘,并把结果存入数组c 
      *比如,12345*12345,a中的5与12345逐位相乘 
      *对于数组c:*(c+i+j)在i=0,j=0,1,2,3,4时存的是5与各位相乘的结果 
      *而在i=1,j=0,1,2,3,4时不光会存4与各位相乘的结果,还会累加上上次相乘的结果.这一点是需要注意的!!! 
     */  
     for(i = 0; i < N; ++i)  
           for(j = 0; j < N; ++j)  
                 *(c + i + j) += *(a + i) * *(b + j);  
     /* 
      *这里是移位、进位 
     */  
     for(i = 0; i < 2 * N - 1; ++i)  
     {  
           *(c + i + 1) += *(c + i)/10;//将十位上的数向前进位,并加上原来这个位上的数  
           *(c + i) = *(c + i)%10;//将剩余的数存原来的位置上  
     }  
}  

int main()  
{  
    int a[N],b[N],c[2*N];  
    char s1[N],s2[N];  
    int j = 2*N-1;  
    int i;  

    printf("input the first number:");  
    scanf("%s",s1);  
    printf("/ninput the second number:");  
    scanf("%s",s2);  

    getdigits(a,s1);  
    getdigits(b,s2);  

    multiply(a,b,c);  

    while(c[j] == 0)  
               j--;  
    for(i = j;i >= 0; --i)  
           printf("%d",c[i]);  
    printf("/n");  
    return 0;  
}  

这是大数相乘的代码实现,这个思路你懂了,你的问题就迎刃而解了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!