这两天看最强大脑,拾起大学的大数运算,用C4写了个tcc的!
c4droid吧
全部回复
仅看楼主
level 13
savage200 楼主
己合成+-*/<>=%,初见成效,还在完善pow,!等,看图先↓
2016年04月22日 06点04分 1
level 13
savage200 楼主
这些是思路手稿,二分试商已否定!改用首位估商,几乎一步算出商!
2016年04月22日 06点04分 2
图压缩的有点狠,看不清了,我发的是很清晰的。。。
2016年04月22日 15点04分
level 13
咦?算法不错呀?!
2016年04月22日 08点04分 4
有代码么?发百度云。
2016年04月22日 08点04分
有代码的,如果感兴趣的人多我就全放出来,现在先放算法!抛砖引玉!看看有没有人有更高明的算法。。。目前,由于tcc编译器限制,只能支持到42亿位计算结果(理论)。如果换编译器将能支持10E4932位计算结果(理论上的,只要内存不出错)
2016年04月22日 14点04分
现在已经可以用来加密数据了,一个循环支持2GB的运算。
2016年04月22日 15点04分
@savage200 😂吧里搞算法的没几个,你用gcc吧,tcc……
2016年04月23日 01点04分
level 13
savage200 楼主
// /////////////////////////////////
// File : Savage_Bignnumberoperation.h
// Author: Savage
// About :Bignumber+-*/
// Savage (C) 2016.3.14
// EM:[email protected]
// /////////////////////////////////
#include "savage_string.h"
static char *Savage_Tip =
"(以确认键结束输入,支持任意长度的两位正整数四则运算!)\n大数运算+-*/→请输入表达式:\n";
static char chr_opr[] = { '=', '>', '<', '+', '-', '*', '/' ,'%'};// 操作符
char *Evaluate(char *const s);// //计算表达式,返回结果
char *findopr(const char *s);// 查找操作符
char *Add(const char *BN_S1, const char *BN_S2);// +
char *Sub(const char *BN_S1, const char *BN_S2);// -
char *Mul(const char *BN_S1, const char *BN_S2);// *
//char *Div(const char *BN_S1, const char *BN_S2);// /
char *Div(const char *BN_S1, const char *BN_S2, char *const str_rem);// /,第三个参数为余数,如果不需要,请传入NULL;需要返回余数,请设置str_rem的长度为BN_S2的长度
char *Mod(const char *BN_S1,const char *BN_S2);
void noborrow(int *const arr, unsigned long const s_size, char *const str);// 计算借位并将差数组存入字符串
void nocarry(unsigned long *const arr, un
2016年04月22日 15点04分 7
操!代码发不出!
2016年04月22日 15点04分
level 13
savage200 楼主
char *Mul(const char *BN_S1, const char *BN_S2)// *
{
unsigned long BN_L1;
unsigned long BN_L2;
if (BN_S1 == NULL || BN_S2 == NULL || (BN_L1 = strlen(BN_S1)) == 0
|| (BN_L2 = strlen(BN_S2)) == 0)
{
return Nul_Str;
}
else
{
unsigned long BN_MAX = BN_L1 + BN_L2;
unsigned long *const BN_Pdt = (unsigned long *const)calloc(BN_MAX, sizeof(unsigned long));// 乘积数组,类型为unsignedlong可以有效减少进位
if (BN_Pdt == NULL)
{
printf("%s", Mem_Err);
return Nul_Str;
}
else
{
unsigned long p1, p2;// 位置指针
// 乘数2逐位乘以乘数1
for (p2 = 0; p2 < BN_L2; p2++)
{
for (p1 = 0; p1 < BN_L1; p1++)
{// 逐位将乘积加入乘积数组,从(BN_MAX-1=BN_L1+BN_L2-1=BN_L1-1+BN_L2-1+1=p1+p2+1)开始由后至前存储
// printf("\n%u:%u*%u=", p1 + p2 + 1, BN_S2[p2] -
// 48,BN_S1[p1] - 48); // chk
arr_add(BN_Pdt, p1 + p2 + 1, (BN_S2[p2] - 48) * (BN_S1[p1] - 48));
}
}
// 输出计算结果
char *const Str_Pdt = (char *const)malloc((BN_MAX + 1) * sizeof(char));// 乘积字符串,多申请一位,末位用于设置字符串结束标志\0
if (Str_Pdt
2016年04月22日 15点04分 9
@部发批磷化氯 不用骂它,它不是人!
2016年05月19日 00点05分
level 13
savage200 楼主
if (Str_Pdt == NULL)
{
free(BN_Pdt);
printf("%s", Mem_Err);
return Nul_Str;
}
else
{
Str_Pdt[BN_MAX] = 0;// 设置字符串结束标志
nocarry(BN_Pdt, BN_MAX, Str_Pdt);// 计算进位并将乘积数组存入字符串
free(BN_Pdt);// 释放乘积数组
nozero(Str_Pdt);// 清除无效零值
return Str_Pdt;// 返回字符串
}
}
}
}
2016年04月22日 15点04分 10
level 13
savage200 楼主
void arr_add(unsigned long *const arr, unsigned long const indx, unsigned long const val)// 计算值添加到结果数组
{
unsigned long t_val;
t_val = arr[indx] + val;
// printf("%u→%u=", val, arr[indx]); // chk
if (t_val < val)// 溢出,有进位
{
t_val = (unsigned long)(arr[indx] / 10) + (unsigned long)(val / 10);// 十位以上求和
if ((arr[indx] = arr[indx] % 10 + val % 10) > 9)// 个位求和有进位
{
t_val += 1;// 进位到十位
arr[indx] %= 10;// 保留个位
}
// printf("↓%u↑", arr[indx]); // chk
if (indx > 0)// 防溢出
arr_add(arr, indx - 1, t_val);// 十位以上进位
}
else
{// 无进位
arr[indx] = t_val;
// printf("%u ", arr[indx]); // chk
}
}
2016年04月22日 15点04分 11
level 13
savage200 楼主
void nocarry(unsigned long *const arr, unsigned long const s_size, char *const str)// 计算进位并将乘积数组存入字符串
{
unsigned long val;
unsigned long i;
for (i = s_size - 1; i < s_size; i--)// unsign long
{
val = arr[i];
// printf("\t[%u#]%u", i, val); // chk
if (val < 10)
{
str[i] = val + 48;// 转字符
// printf("↓%c☞%s ", *(str + i), str + i); // chk
}
else
{// 有进位
str[i] = val % 10 + 48;// 末位转字符
// printf("↓%c☞%s ↑", *(str + i), str + i); // chk
arr_add(arr, i - 1, (unsigned long)(val / 10));// 十位数以上进位
}
}
}
2016年04月22日 15点04分 12
level 13
savage200 楼主
好了,没人看,就放出乘法的代码了。。。已经可以运行了,只要注释掉我自定义的报错返回代码,那些注释后跟//chk的是我演示算法用的,不用理会!
2016年04月22日 15点04分 13
level 13
savage200 楼主
现在还在写pow,效率无提高。。。笨死!码农真不是人当的
2016年04月22日 16点04分 14
level 13
savage200 楼主
_________
ฏ๎๎๎๎๎๎๎๎๎ฏฏ ฏ๎๎๎๎๎๎๎๎้้้้้็็็็็้้้้้็็็็็้้้้้็็็้็็็ฏ๎็็็็็็oด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็
2016年04月22日 17点04分 17
level 9
加油
2016年04月22日 18点04分 18
level 3
楼主写完之后发个源码的下载吧,图上的算法看不清舌),不过算999*999的算法我很喜欢[滑稽]
2016年04月23日 03点04分 19
算法设计的一点创新
2016年04月23日 15点04分
对于除法,你有没有比坚式除法更好的算法
2016年04月23日 15点04分
@savage200 哈哈,我要是有的话我也拿出来造福社会了,问题是没有😭 学长告诫我莫入算法坑
2016年04月24日 03点04分
回复 石项夫 :写算法可以吃一辈子的,比如md5的作者啥也不用干就有钱分,Microsoft Windows,FBI,银行都用的是md5存密码
2016年04月24日 04点04分
level 6
array佔內存還是太多 用linklist寫吧
2016年04月23日 03点04分 20
设计之初,也曾考虑使用链表,可以无需整块的内存,可以利用零碎的内存。但代价是有的,需要记录下一节点的地址,访问下一个数据时,将多一次取地址值的过程,将速度拖慢,特别是处理数据上万位时,十分明显。现在的算法虽没有FFT按位计算高明,但速度相差无几,因为只需遍历结果一遍
2016年04月23日 14点04分
只需遍历一遍,就可得出结果,只要累加值不超过unsigned long的上限约42亿,累加过程将不会发生迭代。
2016年04月23日 15点04分
@savage200 學習下:先
2016年04月25日 01点04分
level 11
虽然看不懂[滑稽]
2016年04月24日 05点04分 21
1 2 3 4 5 尾页