求个简单小程序

qquujj 2007-06-21 08:50:56
急求一个小程序:
要求输入一个一百位以上的数字n,求n的e次方再除以d的余数
其中n可以用随机数获取(输入一个种子),e和d是自己输入的数字

有界面的再送100分
界面至少有三个框框,分别输入三个数,有一个按钮用来求值


/**********************************************/
/*****************求n^e%d的值******************/
/************要求n可以達到百位****************/
/**********************************************/
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
main()
{
double a,b,d,r1,r2;
unsigned n;
int e;
/*clrscr();*/
printf("please input n:");
scanf("%d",&n);
r1=(int)rand(n); /* 獲取隨機數 */
r2=(int)rand(n);
printf("please input e:");
scanf("%d",&e);
printf("please input d:");
scanf("%lf",&d);
/*a=pow(n,e);*/
if(d==0)
printf("wrong input!");
b=fmod(pow(r1,(int)r2),d); /* 用兩個隨機數的乘積獲取一個上百位的數字,然后對d求余. */
printf("%d^%d mod %lf = %f\n",n,e,d,b);

}
double getRan(unsigned d)
{
double r;
srand(d);
r=rand();
return r;
}
...全文
274 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qquujj 2007-06-22
  • 打赏
  • 举报
回复
d应该是整数
e一般的整数就行了,没什要求么
qquujj 2007-06-22
  • 打赏
  • 举报
回复
加油啊...
sjtuyjc 2007-06-22
  • 打赏
  • 举报
回复
先算出 n 除以 d 的余数 x
然后算 x 的 e 次幂,结果为 y
再算 y 对 d 的余数
jixingzhong 2007-06-22
  • 打赏
  • 举报
回复
一个十进制大数运算类,支持加减乘除模、n次乘方、n次开方等运算
[http://www.chinaunix.net/jh/23/813743.html]

这个就是楼主你需要的了 ...
gxqcn 2007-06-22
  • 打赏
  • 举报
回复
请下载最新版本的 HugeCalc,里面 HugeCalc\testDLL\bin\NumberTheoretic.exe 即有楼主需要的“大整数模幂”运算(含该程序界面源代码)。
Inhibitory 2007-06-22
  • 打赏
  • 举报
回复
回复人:qquujj() ( 一级(初级))
我晕,你的问题,你自己不搞搞,反而在这叫别人加油,搞反了吧.
huashizhixin 2007-06-21
  • 打赏
  • 举报
回复
大数乘法,学习
Inhibitory 2007-06-21
  • 打赏
  • 举报
回复
写了个最简单的大数乘法 2345 0000 8888 * 233883 = 00005 4845 5655 7875 2104, 参考一下,照着这个做,再处理一下输入与输出的表示,应该没问题了. 注意,仅供参考,因为真正的大数乘法是要处理很多情况的.而且表示的时候,把最低位放在最后面,最高位放在前面.

输入数字字符用字符串char str[101]来存储,然后把输入的字符串分开来表示成数字,存入整数数组,每个数字最大是四位数9999,因为最大的32位有符号整数是20亿2,147,483,647((unsigned int)0xffffffff / 2),而10000 * 10000是1亿,如果再大的话,如五位数,两个数相乘,结果大于100亿,会溢出而出错.

#include <iostream>
#include <cstdio>
#include <ctime>
#include <cmath>

using namespace std;

void queen(int** array, int row, FILE* fp);
bool isAvailable(int** array, int y, int x);
bool isResult(int** array);

int main(int arg, char** argv) {
int num[10];
for (int i = 0; i < 10; i++) {
num[i] = 0;
}

num[9] = 8888;
num[8] = 0;
num[7] = 2345;

int carry = 0;
int sum = 0;
int result = 0;
int i = 9;
int factor = 233883;
while (i > 0) {
sum = num[i] * factor + carry;
result = sum % 10000;
carry = sum / 10000;
num[i] = result;
i--;
}

for (int i = 0; i < 10; i++) {
printf("%4d ", num[i]);
}

return 0;
}
mathe 2007-06-21
  • 打赏
  • 举报
回复
n的位数不重要,主要是d的大小的问题。
如果d不是很大(可以用普通计算机中整数来表示),那么结果还是很简单的。
n^e (mod d) = (n (mod d))^e (mod d)
所以首先我们就可以用n (mod d)来替换n.
所有主要我们需要实现一个计算 n (mod d)的算法,手工模拟除法足够了。

而对于 r=n(mod d),计算
r^e (mod d)
通常计算方法如下
base=1, mul=r
while(e>0){
if(e&1){
base=(base*mul)%d;
}
mul=(mul*mul)%d;
e>>=1;
}
可以看出,上面算法对于e的位数也没有什么要求,当e的位数也很高时计算也是非常简单的。

当然,如果d也是大整数,那么计算就要复杂很多,我们就需要实现大整数除法运算了,通常大整数除法可以通过先实现乘法,然后通过迭代来实现。
星羽 2007-06-21
  • 打赏
  • 举报
回复
一百位 - v-
ayw215 2007-06-21
  • 打赏
  • 举报
回复
要求输入一个一百位以上的数字n
-----------
unsigned n;
---------
这样业可以村一百位?
huashizhixin 2007-06-21
  • 打赏
  • 举报
回复
r1=(int)rand(n); /* 獲取隨機數 */
r2=(int)rand(n);
;;;;;;;;;;;
不带参数
qquujj 2007-06-21
  • 打赏
  • 举报
回复
后面的程序是我写的,但是不对,希望能对各位有点帮助

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧