搜索
bottom↓
回复: 15

51中怎么计算350×350

[复制链接]

出0入0汤圆

发表于 2012-8-7 16:06:42 | 显示全部楼层 |阅读模式
51中怎么计算350×350 我试了下会不行啊

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-8-7 16:08:20 | 显示全部楼层
强制类型转换到16位再计算

其实也可以用高精度

出0入0汤圆

发表于 2012-8-7 16:16:00 | 显示全部楼层
aheadlead 发表于 2012-8-7 16:08
强制类型转换到16位再计算

其实也可以用高精度

16位 装不下 350*350

出0入0汤圆

发表于 2012-8-7 16:18:16 | 显示全部楼层
350*350=350*(256+64+32-2)

出0入0汤圆

发表于 2012-8-7 16:23:26 | 显示全部楼层
本帖最后由 aheadlead 于 2012-8-7 16:26 编辑
GNMXD 发表于 2012-8-7 16:16
16位 装不下 350*350


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

出0入0汤圆

发表于 2012-8-7 16:36:33 | 显示全部楼层
lbhj310 发表于 2012-8-7 16:18
350*350=350*(256+64+32-2)

这个不错

出0入0汤圆

发表于 2012-8-7 16:53:09 | 显示全部楼层
写个ulong × ulong的子程序啊。

出0入0汤圆

 楼主| 发表于 2012-8-7 20:18:20 | 显示全部楼层
了解了 问题现在解决了

出0入0汤圆

发表于 2012-8-8 11:29:35 | 显示全部楼层
怎么解决的?用大正数算法吗?我觉得太麻烦了,对51的负荷也大。楼主怎么解决的?

出0入0汤圆

发表于 2012-8-8 11:31:06 | 显示全部楼层
以前在poj上写过,不过账号忘了。
#include<stdio.h>
#include<string.h>

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


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

}


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

出0入0汤圆

发表于 2012-8-8 11:56:10 | 显示全部楼层
不太理解楼主的意思。

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

c = a * b;



???

出0入0汤圆

发表于 2012-8-8 12:10:32 | 显示全部楼层
本帖最后由 yangshichang110 于 2012-8-8 12:21 编辑
wallelectronics 发表于 2012-8-8 11:56
不太理解楼主的意思。

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吧。




好像是有的,回家试试。

出0入0汤圆

发表于 2012-8-8 12:25:22 | 显示全部楼层
yangshichang110 发表于 2012-8-8 12:10
加上不同的修饰符, 整型数有以下几种类型;
signed short int 有符号短整型数说明。简写为short或int, 字 ...

没有long int吗??
反正我天天用u32 s32 fp32......

出0入0汤圆

发表于 2012-8-8 12:28:11 | 显示全部楼层
用ULONG,别用高精,内存伤不起。

出0入0汤圆

发表于 2012-8-8 14:55:23 | 显示全部楼层
wallelectronics 发表于 2012-8-8 12:25
没有long int吗??
反正我天天用u32 s32 fp32......

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

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

出0入0汤圆

发表于 2012-8-8 15:00:42 | 显示全部楼层
我不是没事开那么大的整数,24位AD其他数据类型能放得下么?

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 18:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表