永发信息网

大整数减法-C语言

答案:2  悬赏:30  手机版
解决时间 2021-05-12 01:48
题目描述
求2个大的正整数相减的差
输入
第1行是测试数据的组数n,每组测试数据占2行,第1行是被减数a,第2行是减数b(a > b)。每组测试数据之间有一个空行,每行数据不超过100个字符
输出
n行,每组测试数据有一行输出是相应的整数差
样例输入
2 9999999999999999999999999999999999999 9999999999999 5409656775097850895687056798068970934546546575676768678435435345 1
样例输出
9999999999999999999999990000000000000 5409656775097850895687056798068970934546546575676768678435435344
求助啊!!
最佳答案
vc6编译运行通过,结果正确:

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

char a[101], b[101];
char rs[10000];

char* _sub( char* a, char* b, int n )
{
int k = 0;
double t;
for ( int i = 0; i < n; ++i ) {
t = a[i] - b[i] + k;
a[i] = (int)( t - floor( t/10 )*10 );
k = (int)floor( t/10 );
}
return a;
}

void strtonum( char* a )
{
strrev( a );
while( *a ) {
*a = *a - '0';
++a;
}
}
char* numtostr( char* a, int n )
{
int i, t, k;
while( a[n-1] == 0 ) --n;
k = n & 1 ? n/2+1 : n/2;
for ( i = 0; i < k; ++i ) {
t = a[i] + '0';
a[i] = a[n-i-1] + '0';
a[n-i-1] = t;
}
return a;
}

char* sub( char* a, char* b )
{
int n = strlen( a );
strtonum( a );
strtonum( b );
_sub( a, b, n );
return numtostr( a, n );
}
void clear() { while( getchar() != '\n'); }

void input( char* a, char* b )
{
memset( a, 0, 100 );
memset( b, 0, 100 );
gets( a );
gets( b );
}

int main()
{
int n;
scanf( "%d", &n );
clear();

while ( n-- ) {
input( a, b );
sprintf( rs, "%s%s\n", rs, sub( a, b ) );
putchar( '\n' );
}
puts( rs );
}
全部回答

这是个老问题了,解决方法就是,自己模拟计算机的位运算,下面有个代码例子,你看一下吧,摘自百度

输出的时候效率太低,还可以改进 Code: //允许生成1120位(二进制)的中间结果 #ifndef BI_MAXLEN #define BI_MAXLEN 35 #define DEC 10 #define HEX 16 class CBigInt { public: //大数在0x100000000进制下的长度 unsigned m_nLength; //用数组记录大数在0x100000000进制下每一位的值 unsigned long m_ulValue[BI_MAXLEN]; CBigInt(); ~CBigInt(); void Mov(unsigned __int64 A); void Mov(CBigInt& A); CBigInt Add(CBigInt& A); CBigInt Sub(CBigInt& A); CBigInt Mul(CBigInt& A); CBigInt Div(CBigInt& A); CBigInt Mod(CBigInt& A); CBigInt Add(unsigned long A); CBigInt Sub(unsigned long A); CBigInt Mul(unsigned long A); CBigInt Div(unsigned long A); unsigned long Mod(unsigned long A); int Cmp(CBigInt& A); void Get(CString& str, unsigned int system=HEX); void Put(CString& str, unsigned int system=HEX); int Rab(); CBigInt Euc(CBigInt& A); CBigInt RsaTrans(CBigInt& A, CBigInt& B); void GetPrime(int bits); }; #endif #include "stdafx.h" #include "BigInt.h" //小素数表 const static int PrimeTable[550]= { 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 高精度算法

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
QQ拼音升级加速
為什麼我打開DNF的時候見不到TP安全系統的檢
明年(2009)是寡妇年吗?我是没有听过,是不
真的想回到以前的语句,形容男人年轻有位的句
什么是评价、衡量一个支出项目实施好坏的关键
吴亦凡的励志经典语录,骂吴亦凡的经典语录
梦幻西游没降修炼想把20功修点到25要多少钱
怎么样才可以让心里没有负担平静下来
关于独立勇敢的格言,关于自信的名人名言
求生2第一个章节
有些图标怎么取消不掉?
ce 扫描游戏时关闭 怎么办
六年级课本诗歌大全,六年级语文儿童诗歌
达人指教:请问深圳哪里有宠物松鼠卖?
瓷器诗词,求几句形容红色瓷器的诗词!!谢谢
推荐资讯
爱一个人怎么这么难呢|?
有前奏的nokia tune如何下载
保持卫生标语英语,英语谚语
电脑显示CPU占用很高
bigbang的最新歌曲2010年的。
驱魔少年 奏之曲TV版截音又称带歌版下载网址
利用幸运币抽出来的东西怎么装备啊?
怎么安装摄像头监控器,怎样用电脑安装监控摄
拔牙吃什么消炎药好,得了肾炎吃什么药好
同桌的你语录回忆总是,找一首歌,名字叫窗前
我想报自考 但是如何查看自己被录取了呢?
坚持目标的名言警句,形容信念坚定意志顽强目
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?