超大整数加法的含义的加法。。。求助这个程序那里错了。。。谢谢!!!

JAVA超大整数的加法如何改成减法-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
JAVA超大整数的加法如何改成减法
来源:互联网 发表时间: 19:03:38 责任编辑:王亮字体:
为了帮助网友解决“JAVA超大整数的加法如何改成减法”相关的问题,学网通过互联网对“JAVA超大整数的加法如何改成减法”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:JAVA超大整数的加法如何改成减法,具体解决方案如下:解决方案1:你这个道题很有意思,应该是怎么使用算法吧:减法从各位开始计算,需要判断减数和被减数的大小:A. 当减数 &= 被减数,标记后一位不用退位B. 当减数 & 被减数,标记后一位需要退位代码如下:public class HandleLargeNumber {public static void main(String[] args) {int a[] = { 0, 9, 9, 7, 9, 4, 5, 6, 7, 2, 3, 4, 5, 6, 4, 7, 8, 9, 8, 7, 6, 9 };int b[] = { 0, 0, 5, 9, 1, 6, 4, 5, 6, 2, 3, 4, 5, 7, 2, 1, 3, 4, 0, 3, 2, 9 };jianFa(a,b);// 下面是验证:通过BigInteger来做BigInteger a1 = new BigInteger(&&);BigInteger a2 = new BigInteger(&&);System.out.println(a1.subtract(a2));}public static void jianFa(int[] a, int[] b) {int idx1 = getStart(a);print(a, idx1);int idx2 = getStart(b);print(b, idx2);boolean isTui = // 是否退位标记int c[] = new int[a.length];for (int i = a. i & idx1; i--) {if (!isTui) {// 不退位int aNum = a[i - 1];int bNum = b[i - 1];if (aNum &= bNum) {c[i - 1] = aNum - bNisTui =} else {c[i - 1] = 10 + aNum - bNisTui =}} else {// 退位int aNum = a[i - 1] - 1;int bNum = b[i - 1];if (aNum &= bNum) {c[i - 1] = aNum - bNisTui =} else {c[i - 1] = 10 + aNum - bNisTui =}}}System.out.printf(&\n等于:\n&);print(c, getStart(c));}private static int getStart(int[] arr){for (int i = 0; i & arr. i++) {if (arr[i] != 0) {}}return 0;}private static void print(int[] arr, int start){for (int i = i & arr. i++) {System.out.printf(&%d&, arr[i]);}System.out.print(&\n&);}}上面的例子只适用......余下全文>>
??&&返回答案页
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号每日登录:+1西币&+1积分
&下次自动登录
绑定第三方账号登录 & & &
扫描二维码登录支持中心移动端
获取动态密码
| 新手必读 |
You are here:
小车左右横移编码器的程...
热点活动:
小车左右横移编码器的程序,看不懂,求助,谢谢!! - 已解决问题
如tu1所示问题如下&&1、编码器读出来的数,为什么要移位,有什么用?&&&&&&&&&&&&&&&&&&&&&&2、4096这个数怎么来的,怎么计算?&&&&&&&&&&&&&&&&&&&&&3、这是绝对值编码器,还是增量型的&,编码器的数是32位双整数不断累积循环吗,会变为0吗?&&备注:这个编码器是带DP接口的那种,硬件组态里直接连的。
问题补充:我只想搞明白如&&图1&&所示&&&&:&编码器读出的的数PID668是格雷码吗?然后&SLD&&8&&&和&&&&SSD&&&8&&&&两条指令后&&就可以变成2进制码吗??&&和&&DB169.DBD0&&&做减法,再转换成实数吗&&??&所有的格雷码&SLD8&&SSD8&&就能变成2进制码吗&&&??&&是不是我理解错了&?&&&&求高手们&&指教&&&谢谢
图片说明:
产品版区:
悬赏西币:3 | 解决时间: 14:14:23 | 提问者: - 学长&nbsp&nbsp第2级
问题ID:149118
编码器为绝对值型的,4096为一圈的分辨率,一般此类编码器为多圈,多数为4096圈。存在为0的位置,但一般用的是编码器的中部,运行时编码器为往返运行,不会是一个方向,如果一个方向,肯定会无规律出现0.编码器的输出数据格式可能是格雷码等,需要换算。
初级工程师&nbsp&nbsp第9级&
以下网友赞了您的问题:
填写您的评论...
提问者对于答案的评价:自己理解这个是ELCO多圈绝对值编码器pid668是编码器的值(应该是32位二进制值)不是格雷码,高位是状态位,移位是为了移除状态位为了下边程序计算。应该是这样吧&&???&&&&&&&求指正!!最后&&谢谢&&您的回答&&对我很有用
更多相关问题
本版精华问答
等待您来回答
作者/最新回复
最后回复时间
扫描打开手机版
20秒帮我们优化支持中心!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
欢迎您来到找答案
在“找答案”,已有超过7万个被解决的技术问题供您参考!
西门子技术专家亲自把关!常规的,简单的问题,在这里您都可以找到答案!
遇到了问题,就来“找答案”提问。
点击搜索框右侧的提问按钮,只需2步就能成功提交问题!分分钟就有无数大侠前来帮你。
在“找答案”每天都有大量的新问题。
别犹豫,只需要点击问题下方的“我要回答”就能参与。答题不光有积分相送,也会给您积攒大侠人气。
“找答案”定期开展各种有奖活动期待您的参与。
更有机会参加西门子高端用户峰会。领略西门子的博大精深!用string实现大整数加法 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 14时,
//在网上看到的高精度加法,大多是用数组来实现,总受限于大小。于是想能否用string来实现。欢迎指教。
代码片段(1)
1.&[代码][C/C++]代码&&&&
#include &iostream&
#include &string&
string intAdd(string &,string &);
string invert(string &);
int main()
string s1,s2;
cin&&s1&&s2;
string &rs1=s1,&rs2=s2;
string strResult=intAdd(rs1,rs2);
cout&&s1&&endl&&s2&&
cout&&strResult&&
string intAdd(string &rs1,string &rs2)
string str1=invert(rs1);
string str2=invert(rs2);
if(str1.length()&str2.length())
str1.swap(str2);
for(size_t i=0; i!=str2.length(); ++i)
char c1=str1[i];
char c2=str2[i];
int t=((int)c1-48)+((int)c2-48);
int x=t/10;
size_t n=i+1;
int t1=(int)str1[n]-48+x;
if(t1&=10)
str1[n]=(char)(t1%10+48);
str1[n]=(char)(t1+48);
if(n==str1.length())
str1+="1";
while(x!=0);
str1[i]=(char)(t+48);
str1[i]=(char)(t+48);
string &rstrResult=str1;
string strOut=invert(rstrResult);
return strO
string invert(string &src)
string newStr=
for(int i=src.length()-1,j=0; i&=0; --i,++j)
newStr[j]=src[i];
return newS
开源中国-程序员在线工具:
只有加法么???? &+,-,x,&是一家啊
2楼:王阿非 发表于
建议借助vector实现无限长度的加减乘除
开源从代码分享开始
Aaron-Young的其它代码5003人阅读
高精度计算(2)
求两个不超过 200 位的非负整数的和。
有两行,每行是一个不超过 200 位的非负整数,没有多余的前导0。
一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是342,那么就不能
输出为0342。
Output Sample:
首先要解决的就是存储 200 位整数的问题。显然,任何C/C++固有类型的变量都无法保
存它。最直观的想法是可以用一个字符串来保存它。字符串本质上就是一个字符数组,因此
为了编程更方便,我们也可以用数组unsigned an[200]来保存一个200 位的整数,让an[0]存
放个位数,an[1]存放十位数,an[2]存放百位数……
那么如何实现两个大整数相加呢?方法很简单,就是模拟小学生列竖式做加法,从个位
开始逐位相加,超过或达到10 则进位。也就是说,用unsigned an1[201]保存第一个数,用
unsigned an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1 中。要注意处
理进位。另外,an1 数组长度定为201,是因为两个200 位整数相加,结果可能会有201 位。
实际编程时,不一定要费心思去把数组大小定得正好合适,稍微开大点也无所谓,以免不小
心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
参考程序:
#include &stdio.h&
#include &string.h&
#define MAX_LEN 200
int an1[MAX_LEN+10];
int an2[MAX_LEN+10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];
int main()
scanf(&%s&, szLine1);
scanf(&%s&, szLine2);
//库函数memeset 将地址an1 开始的sizeof(an1)字节内容置成0
//sizeof(an1)的值就是an1 的长度
//memset 函数在string.h 中声明
memset( an1, 0, sizeof(an1));
memset( an2, 0, sizeof(an2));
//下面将szLine1 中存储的字符串形式的整数转换到an1 中去,
//an1[0]对应于个位
int nLen1 = strlen( szLine1);
for( i = nLen1 - 1;i &= 0 ; i --)
an1[j++] = szLine1[i] - '0';
int nLen2 = strlen(szLine2);
for( i = nLen2 - 1;i &= 0 ; i --)
an2[j++] = szLine2[i] - '0';
for( i = 0;i & MAX_LEN ; i ++ )
an1[i] += an2[i]; //逐位相加
if( an1[i] &= 10 )
{ //看是否要进位
an1[i] -= 10;
an1[i+1] ++; //进位
bool bStartOutput =
for( i = MAX_LEN; i &= 0; i -- )
if( bStartOutput)
printf(&%d&, an1[i]); //如果多余的0 已经都跳过
if( an1[i] )
printf(&%d&, an1[i]);
bStartOutput = //碰到第一个非0 的值,就说明多余的
if(bStartOutput==false)
printf(&0&);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:89219次
积分:1551
积分:1551
排名:千里之外
原创:61篇
转载:45篇
(1)(2)(8)(35)(15)(18)(3)(24)& & 使用字符串对大整数进行加法计算
& & 发现单纯看代码是件很痛苦的事,虽然这个题目网上到处都是,可的确没有几个写得让人可以很顺畅的看下去,结果就是宁愿自己编个垃圾的,也不愿去看别人的代码(除非是大师级的,不过大师不会编这种简单的代码了吧&&&&)。现在做的一些题目,都是看看大概思路,然后自己实现,实在遇到问题再去看别人的代码,不过就目前为止勉强都可以自己编着试试,毕竟还没有涉及到很复杂的算法。
& & 要使用字符串进行加法,主要是要解决进位的问题。
& & 先将两个字符串逆置,之后再逐位相加并存入另一个字符串中(相加过程中要检查是否有进位),最后将得到的字符串逆置就可以得到结果(其实可以从字符串末尾开始倒着计算,不过逆置之后再求值感觉更顺畅些,思维惯性使然)。
#include&stdio.h&#include&string.h&
void reverse( char *s ) & & & &/*将字符串逆置*/{& & & &&int i = 0; & && & &&length = strlen( s ); & &&while( i & length - i - 1 ) & &&{
& &&& &&temp = s[i];
& &&& &&s[i] = s[length - i - 1];
& &&& &&s[length - i - 1] =
& &&& &&i++; & &&}}
void AddBigNum( char* s1, char* s2, char* result ){ & &&int len1 = strlen( s1 ); & &&int len2 = strlen( s2 ); & &&int acc = 0, temp, & & & &/*acc为进位标记*/ & &&if( s1 == NULL || s2 == NULL || result == NULL ) & &&{
& &&& && & &&} & &&reverse( s1 ); & &&reverse( s2 ); & &&for( i = 0; i & len1 && i & len2; i++ ) & &&{
& &&& &&temp = s1[i] - '0' + s2[i] - '0' + & & & &/*计算每位的实际和*/
& &&& &&result[i] = temp % 10 + '0'; & & & &/*通过求余数来确定每位的最终值*/
& &&& &&if( temp &= 10 ) & & & &/*通过这个if..else..条件来判断是否有进位,并设置进位值*/
& &&& &&& &&acc = 1;
& &&& &&else
& &&& && &&&acc = 0; & &&} & &&if( i & len1 ) & & & &/*两个加数位数不同*/ & &&{
& &&& &&for( ; i & len1; i++ )
& &&& &&& &&temp = s1[i] - '0' + & & & &/*依旧要考虑进位,比如9999 + 1的情况*/
& &&& &&& &&result[i] = temp % 10 + '0';
& &&& &&& &&if( temp &= 10 ) & & & &
& &&& &&& &&& &&acc = 1;
& &&& &&& &&else
& &&& &&& &&& &&acc = 0;& &&& &&} & &&} & &&if( i & len2 ) & &&{
& &&& &&for( ; i & len2; i++ )
& &&& &&& &&temp = s2[i] - '0' +
& &&& &&& &&result[i] = temp % 10 + '0';
& &&& &&& &&if( temp &= 10 )
& &&& &&& &&& &&acc = 1;
& &&& &&& &&else
& &&& &&& &&& &&acc = 0;
& &&& &&} & &&}
& & if( acc == 1 ) & & & &/*考虑如:123 + 911 = 1034的情况,如果不增加这个条件会得到结果为034,进位被舍弃*/
& & & & result[i++] = &1&;
& &&result[i] = '\0'; & &&reverse( result );}
main(){ & &&char s1[] = ""; & &&char s2[] = ""; & &&char result[100]; & &&AddBigNum( s1, s2, result ); & &&printf( "%s\n", result );}
阅读(...) 评论()

我要回帖

更多关于 整数加法的含义 的文章

 

随机推荐