c++大整数求余数

给定一个大整数,a[1000],求他对于一个整数b,的模,最好是直接写个函数,然后稍微给菜鸟我注释一下,谢谢... 给定一个大整数,a[1000],求他对于一个整数b,的模,最好是直接写个函数,然后稍微给菜鸟我注释一下,谢谢 展开
 我来答
White_MouseYBZ
2013-12-13 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6622万
展开全部
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
char *amodb(char *a,char *b){
int i,j,la,lb=strlen(b);
while((la=strlen(a))>lb || la==lb && strcmp(a,b)>=0){
for(i=la-1,j=lb-1;j>=0;a[i--]-=(b[j--]-'0'));
for(i=la-1;i>0;i--)
if(a[i]<'0'){
a[i]+=10;
a[i-1]--;
}
while(*a=='0') a++;
}
return a;
}
void main(void){
char a[]="123452346156",x[15],*p;
int b=123456;
p=amodb(a,itoa(b,x,10));
printf("The result is %s.\n",*p ? p : "0");
}
原理是用大数减法计算a[1000]-b,一直减到结果小于b,则结果就是所求。
更多追问追答
追问
是很大的数哦,这样减太慢了,要等很久,有没有别的算法
追答
我也还没有想出好办法。用同余定理,结果中间数仍然太大而不能正确表达……不过,若b不是大数的话,给你提供一个供参考:
int xmody(char *x,int y){
int i,m;
for(m=i=0;x[i];i++)
m=((m*10)%y+(x[i]-'0')%y)%y;
return m;
}
void main(void){
char a[]="123452346156";
int b=123456;
printf("The result is %d.\n",xmody(a,b));
}
今天决定不起床了
2013-12-12 · TA获得超过1865个赞
知道小有建树答主
回答量:298
采纳率:0%
帮助的人:408万
展开全部
#include<iostream>
using namespace std;
int main()
{
int a[1000], len = 999, b, t = 0;
while ( len > 0 && a[len] != 0 ) len--;
for (int i = len; i >= 0; --i)
{
t = t * 10 + a[i]; //t为当前余数
t = t % b;
}
cout << t << endl;
return 0;
}

例如 125/6
125=((1)*10+2)*10+5
在每个括号内取一次模,这样就可以从高位向低位枚举了
可以直接模拟一下这个过程~
追问
..真心没看懂,求讲解原理
追答
几天没来,上面的被采纳回答说得好偏,还是补充一下吧,以便让后来的同学看到。
同余定理不是这样的,这里只是用到了同余的一个基本性质,一般数论书的第一节就会介绍:
a mod b = c
b mod b = e
两式可以相加得到:
(a+b) mod b = (c+d) mod b
回到这个问题,简化地考虑三位数abc,则:
abc=a*100+b*10+c
abc mod 10 = (a*100+b*10+c) mod 10 = ((a*10+b)*10+c) mod 10
然后用上面的基本公式,每一步运算均模10处理。
for循环就是从高位到低位操作,每次把当前余数乘以10,再加上当前位(也即从abc mod 10那个式子的最里的括号,一直运算到最外的括号)。

可以百度“高精度运算”获得更多内容。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式