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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
快速幂算法 - JS 实现
快速幂算法 - JS 实现
大数运算(8)——大数幂运算
幂的实现是最为简单的了,因为有了前面的算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束。 下面是C语言代码实现:
高精度幂运算(java大数)
链接: 求高精度幂 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。  现在要你解决的问题是:对一个实数R( 0.0 ,要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 。 输入输入有多行,每行有两个数R和n,空格分开。R的数
模运算与幂运算
模运算与幂运算          你需要花多少时间做下面这道题:     123456789 * 987654321 = (      )       A. 121932631112635266       B. 121932631112635267       C. 121932631112635268       C. 121932631112635269     既然是选择题
利用go求幂的几种方法
/* * 二分幂法 求x^n */// 求整数幂 package mainimport ( "fmt" "math" )func main() { var x float64 var n int fmt.Scanf("%f%d", &x, &n) fmt.Println(powerf(x, n)) fmt.Println(powerf2
POJ NOI MATH-7833 幂的末尾
问题链接:POJ NOI MATH-7833 幂的末尾。 总时间限制: 1000ms内存限制: 65536kB 描述 幂ab的末3位数是多少? 输入两个正整数a,b。1 输出从高位到低位输出幂的末三位数字,中间无分隔符。若幂本身不足三位,在前面补零。样例输入 7 2011 样例输出 743 来源2011年我爱数学少年夏令营数学竞赛 第4题 问
自幂数(典型的水仙花数)-20151107
自幂数是指一个n位数,它的每个位上的数字的n次幂之和等于它本身。(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153时的一个自幂数) 需要使用指数函数,需要如下头文件 #include "cmath"eg:/* *eg:153,1^3 + 5^3 + 3^3 = 153 *n = 1,自幂数称为独身,0,1,2,3,4,5,6,7,8,9 都是自幂数 *n = 2,没有自幂数
快速幂算法和大整数求模
** 1.快速幂的算法** (1)当我们求一个数的n次方的的结果时,若直接选择for循环,来累乘的话,效率很低,时间复杂度位O(n),而当我们选择快速幂来计 算时,时间复杂度能达到O(logn),快了很多。快速幂的基本方法基于二进制,将n次方分解,每次计算平方。如下: 假设我们要求5^23(5的23次方),因为23换为二进制为:10111。即2^4*1+2^3*0+2^2*1+2^1*1+2^0*
求a的b次幂的最后3位(难度:1颗星)
问题描述:输入a,b,其中a和b的范围是【2,999999999】,求出a的b次幂的最后3位。PS: 如果最后三位是001,那么输出1就可以了。问题分析:这个问题的实际上是求a的b次幂mod 1000的结果,把这个问题一般化,实际上是a的b次幂mod n的结果。(X*Y)%Z=((X%Z)*(Y%Z))%Z 根据蒙格马利快速幂模算法,我们可以方便求解,下面举个例子。2^7:2*2*2*2*2*2
JS实现幂运算 x的平方
Math.pow(x,y) // x的y次幂 x——底数,y——幂数 x,y必须为数字eg:Math.pow(2,3) 表示2的三次方 结果为8