wan296555869 发表于 2012-8-7 16:06:42

51中怎么计算350×350

51中怎么计算350×350 我试了下会不行啊

aheadlead 发表于 2012-8-7 16:08:20

强制类型转换到16位再计算

其实也可以用高精度

GNMXD 发表于 2012-8-7 16:16:00

aheadlead 发表于 2012-8-7 16:08 static/image/common/back.gif
强制类型转换到16位再计算

其实也可以用高精度

16位 装不下 350*350

lbhj310 发表于 2012-8-7 16:18:16

350*350=350*(256+64+32-2)

aheadlead 发表于 2012-8-7 16:23:26

本帖最后由 aheadlead 于 2012-8-7 16:26 编辑

GNMXD 发表于 2012-8-7 16:16 static/image/common/back.gif
16位 装不下 350*350

如果32位不行的话考虑高精度
还可以从汇编的角度考虑(不过我不会...)

raxb 发表于 2012-8-7 16:36:33

lbhj310 发表于 2012-8-7 16:18 static/image/common/back.gif
350*350=350*(256+64+32-2)

这个不错

mowin 发表于 2012-8-7 16:53:09

写个ulong × ulong的子程序啊。

wan296555869 发表于 2012-8-7 20:18:20

了解了 问题现在解决了

yangshichang110 发表于 2012-8-8 11:29:35

怎么解决的?用大正数算法吗?我觉得太麻烦了,对51的负荷也大。楼主怎么解决的?

yangshichang110 发表于 2012-8-8 11:31:06

以前在poj上写过,不过账号忘了。
#include<stdio.h>
#include<string.h>

void chengfa(char *a,char*b)
{
char c;
int fuhao1,fuhao2;
if(a == '-' || a == '+') {
if(a == '-')
   fuhao1 = -1;
else fuhao1 = 1;
strcpy(c,a+1);
strcpy(a,c);
}
if(b == '-' || b == '+') {
if(b == '-')
   fuhao2 = -1;
else fuhao2 = 1;
strcpy(c,b+1);
strcpy(b,c);
}
int i , j;
for(i = 0; i< 10000;i++){
c = '0';
}
int lena = strlen(a);
int lenb = strlen(b);
for(i = lena-1;i >=0;i--){
int k = 0;
for(j = lenb-1;j >=0;j--) {
   char l = c;
   c = (c-'0'+(b-'0')*(a-'0')+k)%10+'0';
   k = (l-'0'+(b-'0') * (a -'0')+k)/10;
}
if(k!= 0) c += k;
}
i = 0;
j = 0;
while(c == '0') i++;
while(i <= lena+lenb-1) {
a = c;
j ++;
i ++;
}
a = '\0';
if(a == '\0') a = '0',a = '\0';
if(fuhao1*fuhao2 == -1 && a !='0') {
strcpy(c,a);
a = '-';
a = '\0';
strcat(a,c);
}
}


int main()
{
char a,b;
while(scanf("%s %s",a,b) == 2) {
chengfa(a,b);
printf("%s\n",a);
}

}


刚学51,但觉得51用这种算法会不会很浪费?

wallelectronics 发表于 2012-8-8 11:56:10

不太理解楼主的意思。

u32 a = 350;
u32 b = 350;
u32 c = 0;

c = a * b;



???

yangshichang110 发表于 2012-8-8 12:10:32

本帖最后由 yangshichang110 于 2012-8-8 12:21 编辑

wallelectronics 发表于 2012-8-8 11:56 static/image/common/back.gif
不太理解楼主的意思。

u32 a = 350;


加上不同的修饰符, 整型数有以下几种类型;
signed short int 有符号短整型数说明。简写为short或int, 字长为2
字节共16位二进制数, 数的范围是-32768~32767。
signed long int 有符号长整型数说明。简写为long, 字长为4字节共
32位二进制数, 数的范围是-2147483648~2147483647。
unsigned short int 无符号短整型数说明。简写为unsigned int, 字长
为2字节共16位二进制数, 数的范围是0~65535。
unsigned long int 无符号长整型数说明。简写为unsigned long, 字长
为4字节共32位二进制数, 数的范围是0~4294967295。

LZ的意思是,350*350=12250
大于了整数范围。

好像单片机C没有unsigned long int吧。




好像是有的,回家试试。

wallelectronics 发表于 2012-8-8 12:25:22

yangshichang110 发表于 2012-8-8 12:10 static/image/common/back.gif
加上不同的修饰符, 整型数有以下几种类型;
signed short int 有符号短整型数说明。简写为short或int, 字 ...

{:sweat:} 没有long int吗??
反正我天天用u32 s32 fp32......{:sweat:}

xbwpc 发表于 2012-8-8 12:28:11

用ULONG,别用高精,内存伤不起。

yangshichang110 发表于 2012-8-8 14:55:23

wallelectronics 发表于 2012-8-8 12:25 static/image/common/back.gif
没有long int吗??
反正我天天用u32 s32 fp32......

= =你没事开这么大整数做什么...
我一般开的好保守的,以前觉得这是好习惯。。。
现在发现,经常到后面要改定义= =

一般51,开内存,应该怎么算,知道能开多少ulong之类的?

wallelectronics 发表于 2012-8-8 15:00:42

我不是没事开那么大的整数,24位AD其他数据类型能放得下么?{:lol:}

页: [1]
查看完整版本: 51中怎么计算350×350