标题:求一个十进制300位的质数
只看楼主
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
得分:0 

//以下是一个未完工的源程序。
//只实现了 初始化,建造,显示,加法,加1操作。
//其余的操作你可以参考以下,自己独立完成。



//建立数据结构,以数组的形式模拟 10进制多位数 的 加 减 乘 除 模 运算

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

#define MAXDIGIT 300 //10进制多位数的最高位数

typedef struct
{
int value[MAXDIGIT+1]; //以数组形式存放每个位数的数值。
//value[0]存放最后1位
//value[1]存放倒数第2位,以此类推。
//value[DIGIT]中存放溢出标志
int digits; //数值的总位数
//如数值为 123456789,则digits=9
//如数值为 12345678901,则digits=12
} BigValueNumber;

void Initial_BVN(BigValueNumber *NewValue)
//初始化
//输出:将10进制多位数的各个数位置为0,
// 溢出标志置为0
// 总位数置为1
{
int i;
for(i=0;i<=MAXDIGIT;i++)
{
NewValue->value[i]=0;
}
NewValue->digits=1;
}

void Construct_BVN(BigValueNumber *NewValue)
//构造新的10进制多位数
//输入:从键盘输入10进制数
//输出:将键盘输入的10进制数存入相应的数位,并修改总位数,溢出标志置0
{
int i,s_Len;
char *s=(char *)malloc(sizeof(MAXDIGIT));
gets(s);
s_Len=strlen(s);
if(s_Len>MAXDIGIT)
{
s_Len=MAXDIGIT;
}
for(i=0;i<s_Len;i++)
{
NewValue->value[s_Len-i-1]=*(s+i)-'0';
}
NewValue->digits=s_Len;
free(s);


/* printf("\n%s\n",s);
printf("s的长度是%d !!!\n",strlen(s));
printf("新串是:\n");
for(i=0;i<MAXDIGIT;i++)
printf("%d",NewValue->value[i]);
printf("\n新数的长度是%d\n",NewValue->digits);
*/
}

void Show_BVN(BigValueNumber *Number)
//数位从高到低向屏幕输出10进制多位数并显示总位数
{
int i;
for(i=MAXDIGIT-1;i>=0;i--)
{
printf("%d",Number->value[i]);
}
printf("\n该数是一个十进制%d位数。\n",Number->digits);
}

void Add_BVN(BigValueNumber *To,BigValueNumber *From,BigValueNumber *Result)
//加法
//输入:两个参与加法运算的10进制多位数,To为加数,From为被加数
//输出: 将最后结果存入 Result
{


int i;
if(From->digits>MAXDIGIT||To->digits>MAXDIGIT)
{
printf("操作数溢出\n");
exit(1);
}

Result->digits=To->digits;
if((From->digits)>(To->digits))
Result->digits=From->digits;
//取出数位较大的数的位数,存入和中

for(i=0;i<Result->digits;i++) //将同位数相加
{
Result->value[i]+=To->value[i]+From->value[i];
if(Result->value[i]>9)
{
Result->value[i]-=10;
Result->value[i+1]++;
}
}

if(Result->value[Result->digits]==1) //出现进位时,将总位数加1
{
Result->digits++;
}

if(Result->value[MAXDIGIT]==1) //总位数超过MAXDIGIT
{
printf("溢出,结果可能不正确\n");
}
}

void Add1_BVN(BigValueNumber *To)
//自身加1
{
int i;
if(To->digits>MAXDIGIT)
{
printf("操作数溢出\n");
exit(1);
}

To->value[0]++; //加1
for(i=0;i<To->digits;i++)
{
if(To->value[i]>9)
{
To->value[i]-=10;
To->value[i+1]++;
}
}
if(To->value[To->digits]==1) //出现进位时,将总位数加1
{
To->digits++;
}

if(To->digits>MAXDIGIT) //总位数超过MAXDIGIT
{
printf("溢出,结果可能不正确\n");
}
}

void Substract_BVN(BigValueNumber *To,BigValueNumber *From)
//减法
{

}


int main(void)
{
BigValueNumber a,b,c;
printf("******************输入被加数***********************\n");
Initial_BVN(&a);
Construct_BVN(&a);
Show_BVN(&a);

printf("******************输入加数*************************\n");
Initial_BVN(&b);
Construct_BVN(&b);
Show_BVN(&b);

printf("******************开始计算*************************\n");
Initial_BVN(&c);
printf("原结果是:\n");
Show_BVN(&c);
Add_BVN(&a,&b,&c);
printf("最后结果是:\n");
Show_BVN(&c);

printf("******************输入要执行+1操作的原数***********\n");
Initial_BVN(&a);
Construct_BVN(&a);

printf("******************开始计算*************************\n");
Add1_BVN(&a);
Show_BVN(&a);

getchar();
getchar();
return 0;
}

[此贴子已经被作者于2007-11-10 23:20:09编辑过]


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-10 22:42
etsunny
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2007-10-11
得分:0 

后来我在考虑32768进制,那样效率会不会高一点?


圣火从希腊蔓延,带着普罗米修斯的祝愿
2007-11-11 11:49
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
得分:0 
想法不错。可以考虑。

人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-11 18:22
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
得分:0 

没人?
自己顶一下。
期待高手的指点。


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-16 21:00
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 

怎么不考虑65536进制呢。非要浪费掉一位?
N进制运算不是问题,关键是显示,怎么把N进制显示成十进制的数字呢?
以前就做过一个3的一百次方精确到各位。并且还是用Basic在文曲星上写的……高一


专心编程………
飞燕算法初级群:3996098
我的Blog
2007-11-17 15:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-184661-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039129 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved