c++ 输入a,b两个整数,求a的b次方 我超了int的界 想到用字符串处理,但是不知道怎么实现,高手指点下

如题所述

两个大整数相乘更好的做法是用int数组实现,将大整数位数分段,每段用一个int实现,只需保证每段的平方不溢出即可。每段相乘结果超过段长的就向下一个int进位。该做法附加操作少,直接调用硬件的操作多,程序运行效率高。
正常的做法是一个int表示多位,为了编程方便,一个int只表示一位,区别并不本质

#include <iostream>
using namespace std;

//乘法函数,被乘数置于数组p中,n为被乘数位数,返回结果位数
int product(int *p,int a,int n)
{
int i,carry=0,temp;
for(i=0;i<n;i++)
{
temp=p[i]*a;
p[i]=(temp+carry)%10;
carry=(temp+carry)/10;
}
while(carry>0)
{
p[n]=carry%10;
carry=carry/10;
n=n+1;
}
return n;
}

void main()
{
int p[1000],a,b,n; //结果位数上限1000,可更改
cout<<"input a b:"<<endl;
cin>>a>>b;
p[0]=1;
n=1;
while(b--) n=product(p,a,n);
cout<<"result:"<<endl;
while(n-->0) cout<<p[n];
cout<<endl;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-08
写一个长整数的类吧!用长整数可以实现任意长度的数学运算。追问

求指点 求真相

追答

不知你有没有学习到数据结构这门课程?如果学习了,实现长整数应该不难。而且实现了以后都可以拿来用。长整数的实现用到循环双向链表。每个结点为一个int型的整数。。

追问

数据结构还没学呢,用链表应该是不个不错的思路,呵呵 谢谢

第2个回答  2011-08-08
给你个程序,你先试试吧~

#include <stdio.h>
#include<string.h>
#include<ctype.h>
int lenn,a[100],c1[100],k1[100],lena,lenb,lenc,k;
char n[100];
void calc (char a[],int b[],int c[])
{
int i, j;
for(i=0;i<100;i++)c[i]=0;
lenc=lena>lenb?lena:lenb;
for (i=0;i<lena;i++)
for (j=0;j<lenb;j++)
c[i+j]+=(a[i])*b[j];
for (i=0;i<lenc;i++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
while (c[lenc])
{
c[lenc+1]+=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
}
int main()
{
int i,j;
scanf("%s%d",n,&k);
lena=strlen(n);
for(i=0;i<lena;i++)
n[i]-='0';
c1[0]=1;
lenb=1;
for(i=0;i<k;i++)
{calc(n,c1,k1);for(j=0;j<lenc;j++)c1[j]=k1[j];lenb=lenc;}
for(i=lenc-1;i>=0;i--)
printf("%d",c1[i]);
return 0;
}追问

好像10的10次就已经输出不不了了。。。和int差不多么

追答

嗯,你可以把最开始的数组开大一点,比如:int lenn,a[10000],c1[10000],k1[10000],lena,lenb,lenc,k;

计算n的k次方
因为输入n是字符串
所以得出它的长度再把它的元素变为数字
c1是存储结果的,让他初始是1
lenb是c1的长度
循环k次
计算n*c1结果为k1
把k1的值复制到c1
最后输出c1
高精度乘法(高乘高)的变形

追问

调大了数组 试了 没用额。。。我自己做的思路类似 但也做不对

追答

唔,等下。我再看看

追问

谢了。。感动中

追答

嗯我还得再看看,一直是这个小毛病。满足输入不是(i*10^k^m)都是对的。bug的说....嗯,再搞搞吧。明天给你答复~

第3个回答  2011-08-08
用数组才行。追问

关键是怎么做呢。。高精度?不太懂

第4个回答  2011-08-07
用long型行不行?追问

显然不行

追答

那就用浮点数。字符串不能进行数学运算,因为字符串不是数,而是字符。运算结果如果要送显示,再编程为字符串。

追问

浮点数也不行。。。

追答

如果你一定要用字符串,那是有一个笨办法,用累加的方法。建立一个双重循环,内层循环a*a=a+a+.......+a,a个a相加,就是a*a,因为a是字符串,所以要用累加的办法,从低位加起。注意进位的处理;外层循环b次,就是b个a相乘了。

c++ 输入a,b两个整数,求a的b次方 我超了int的界 想到用字符串处理,但是...
两个大整数相乘更好的做法是用int数组实现,将大整数位数分段,每段用一个int实现,只需保证每段的平方不溢出即可。每段相乘结果超过段长的就向下一个int进位。该做法附加操作少,直接调用硬件的操作多,程序运行效率高。正常的做法是一个int表示多位,为了编程方便,一个int只表示一位,区别并不本质 ...

...用键盘输入两个数a和b,然后输出的结果是a的b次方。不用POW(a,b...
那就自己写pow函数呗……用for循环(或者其他循环也行),计数变量每增加1就用乘以一次a,最后输出结果咯 再不懂的话百度Hi我吧。

c++实现a的b次方,菜鸟求助
void main() { int a,b,i; long long int c;cin>>a>>b; c=1; for ( i=0;i<b;i++ ) c*=a;cout<<c<<endl;}

c++ 求a的b次方代码求改
sum=sum*out(a,b-less);} 同理改为 while(num--) sum *= sum * out(a,b-less);另外,main是int类型的,不能为float

设计一个求a的b次方的程序,用C++
include<iostream> using namespace std;main(){ int a,b,sum=1;cout<<"input a and b:"<<endl;cin>>a>>b;for(int i=0;i<b;i++)sum*=a;cout<<"sum="<<sum<<endl;}

a的b次方除c求余 c++程序,
求 a的b次方 最简单的方法是 s = 1;for( i=0; i!=b; ++i ) s*=a;return s;这个算法效率太低,假如只能想到这个算法,出门别说自己是搞软件的^_^ 考虑到 a^b = (a的平方)^(b的一半) 这个公式,可以写成 if(b==0) return 1;if(b==1) return b;s = 递归( a*a, b\/2 ...

用C++编程 输入 底数和指数 ,输出底数的指数次方
include<math.h>#include<stdio.h>void main(){ double x,n,y; sacnf("%f,%f",&x,&n);\/\/输入底数和指数 y = pow(x,n);\/\/求次方 printf("%f的%f次方为%f",x,n,y);\/\/输出}

用c++编程求A^B(A的B次方)的最后三位数表示的整数,非暴力算法?谢谢!加5...
还是暴力算法,每次和A最后3位相乘后保留其最后3位再和A最后3位相乘

c++,a的b次方求余,优化算法(当b很大)(不用位运算),就用简单的数学方法优...
include <stdio.h>int powmod(int a,int b,int m) \/\/a的b次方对m求余{ int i,t=1; for (i=0;i<b;++i) { t*=a; t%=m; } return t;}int main() \/\/测试{ printf("%d",powmod(3,20,7));} 以上算法基于这样的数学结论:(x*y)%m==(x%m*y)%m ...

用C++语言求出a的N次方
include <iostream> include <math.h> using namespace std;int main(){ double a,b;cin>>a;int N;cin>>N;b=pow(a,N);cout<<b;system("pause");return 0;}

相似回答