飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5285|回复: 15

[C/C++] 我想做c语言的模拟CPU乘法算法的小程序算法错误

[复制链接]

该用户从未签到

发表于 2014-3-11 21:39:57 | 显示全部楼层 |阅读模式
但我却不知道错在哪里了,初学者  希望大神能帮忙做下
  1. #include "stdio.h"
  2. void AddBool(char a,char b,char n);
  3. void Displacement(char x[],int t);
  4. char m=0,n=0;
  5. void main()
  6. {
  7.         char Product[9]={"00000000"},Parproduct[9]={"00000000"};
  8.         char *p1,*p2;
  9.         p1=Product+4;
  10.         p2=Parproduct+4;
  11.         scanf("%c",p1);
  12.         scanf("%c",p2);
  13.         n=0;
  14.         Displacement(Parproduct,9);
  15.         for(int i=0 ;i<=7;i++)
  16.         {
  17.                 AddBool(Product[i],Parproduct[i],n);
  18.                 Displacement(Parproduct,8);
  19.                 Product[7-i]=m;
  20.                 if(i=7){Product[0]=n;}
  21.                
  22.         }
  23.         for(int j=7;j>=0;j--)
  24.         {
  25.                 printf("%c",Product[j]);
  26.         }
  27. }
  28. void AddBool(char a,char b,char n)//一位加法算法
  29. {
  30.         if(a&&b){n=1;}
  31.         if(n&&b){n=1;}
  32.         if(a&&b){n=1;}
  33.         m=a^b^n;
  34. }
  35. void Displacement(char x[],int t)
  36. {
  37.         for(int i=6;i>=0;i--)
  38.         {
  39.                 x[i]=x[i+1];
  40.         }
  41. }
复制代码


PYG19周年生日快乐!

该用户从未签到

发表于 2014-3-13 03:32:08 | 显示全部楼层
丨零丶 发表于 2014-3-13 00:27
我的思路是这样的定义一个ALU函数模仿cpu 的ALU结构  从键盘输入一个被乘数Multiplicandc[5]和一个乘数Mult ...

            1  0  1  0
     *      1  1  0  1
————————— ——
             1  0  1  0
         0  0 0  0
      1 0  1  0
   1 0  1 0
————————————
1 0 0 0 0  0   1  0  
太马虎了 。。。

题外话,CPU真不是这样计算乘法的,不过只是一个描述逻辑的题,可以练一下代码。


  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include <windows.h>
  4. #define MAX 100

  5. char szNum1[] = "1011111101";   // 765
  6. char szNum2[] = "10111";        // 23
  7. char szCount[MAX] = {'0'};        // 100010010111011  // 17595

  8. VOID AddString(char* szCount )
  9. {
  10.     int i = 0;
  11.     do
  12.     {
  13.         if ( *(szCount + i) & 0xCF )
  14.         {
  15.             *(szCount + i ) = 0x30;
  16.         }
  17.         else
  18.         {
  19.             *(szCount + i ) = 0x31;
  20.             break;
  21.         }
  22.         i++;
  23.     }
  24.     while( i < MAX - 20 );
  25. }

  26. VOID ShowString()
  27. {
  28.     int nlen = strlen(szCount) - 1;
  29.     BOOL bFind = FALSE;
  30.     for ( int i = 0; i <= nlen ; i++ )
  31.     {
  32.         if ( bFind == FALSE && *(szCount + nlen - i ) == '0' )
  33.         {
  34.             continue;
  35.         }
  36.         bFind = TRUE;
  37.         printf("%c",*(szCount + nlen - i ));
  38.     }
  39. }

  40. int _tmain(int argc, _TCHAR* argv[])
  41. {

  42.     memset(szCount,'0',MAX);
  43.     int nLen1 = strlen(szNum1) - 1;
  44.     int nLen2 = strlen(szNum2) - 1;

  45.     for ( int i = 0 ; i <= nLen2 ; i++ )
  46.     {
  47.         for ( int j = 0; j <= nLen1 ; j++ )
  48.         {
  49.             char t = (szNum2[ nLen2 - i ] & 0xCF) & (szNum1[ nLen1 - j] & 0xCF);
  50.             if ( (szCount[j+i] & 0xCF) && t )
  51.             {
  52.                 szCount[j+i] = '0';
  53.                 AddString( szCount + j + i + 1 );
  54.             }
  55.             else
  56.             {
  57.                 if ( !(szCount[j+i] & 0xCF) )
  58.                 {
  59.                     szCount[j+i] = ( t | 0x30 );
  60.                 }
  61.             }
  62.         }
  63.     }
  64.     ShowString();

  65.     return 0;
  66. }
复制代码


我录过一套C视频 免费的 有兴趣的话你可以看下








点评

你的视频在哪啊 我怎么没在论坛找到啊  发表于 2014-3-13 18:51
PYG19周年生日快乐!
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

发表于 2014-3-11 21:53:18 | 显示全部楼层
Displacement   参数t从未使用。Add bool函数中n永远是零
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2014-3-12 19:35:28 | 显示全部楼层
Nisy 发表于 2014-3-11 21:53
Displacement   参数t从未使用。Add bool函数中n永远是零

在算法中我将n作为全局变量  每次使用n之前进行初始化也就是n置0;在运算过程中n会改变,我是将n作为进位传递的参数的,而那个函数中的t我是作为数组变量的长度传递进去的  t可以不做使用的

点评

CPU乘法算法 // CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂你代码的意思  详情 回复 发表于 2014-3-12 21:35
PYG19周年生日快乐!

该用户从未签到

发表于 2014-3-12 21:35:13 | 显示全部楼层
丨零丶 发表于 2014-3-12 19:35
在算法中我将n作为全局变量  每次使用n之前进行初始化也就是n置0;在运算过程中n会改变,我是将n作为进位 ...

CPU乘法算法  // CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂你代码的意思
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2014-3-13 00:27:25 | 显示全部楼层
我的思路是这样的定义一个ALU函数模仿cpu 的ALU结构  从键盘输入一个被乘数Multiplicandc[5]和一个乘数Multiplierc[5]
之后定义一个函数CTB()来转换这两个输入项,转换成bool类型的Multiplicandb[4],Multiplierb[4],因为bool类型的数值是1和0,长得像CPU的0跟1  所以用这种类型
接着定义一个FA函数用来做逻辑运算,将Product的前四位跟Multiplicandb按位做逻辑运算进位数据保存在c[5]中,运算前将Product进行移位运算Displacement;
最后将Product转换成字符串输出。模型为
             1  0  1  0
     *      1  1  0  1
————————— ——
             1  0  1  0
          1 0  1  0
      0  0 0  0
   1 0  1 0
————————————
   1 1  0 1  1   1  0  

  1. #include "stdio.h"

  2. void ALU(bool x[],bool y[],bool p[],bool g[],bool c[]);
  3. void FA(bool a,bool b,bool c[]);
  4. void CTB(char a[],bool b[],int i);
  5. void Displacement(bool a[],int i,bool b[]);
  6. void BTC(bool a[],char b[],int i);
  7. //函数定义

  8. void main()
  9. {
  10.         char Multiplicandc[5],Multiplierc[5],Depositc[9];
  11.         bool Multiplicandb[4],Multiplierb[4];
  12.         bool Depositb[2]={00};
  13.         bool Product[8]={00000000};
  14.         bool p[4],g[4],c[5]={00000};
  15.         int i,n;
  16.         //变量定义
  17.        
  18.         printf("请输入两个四位二进制数(例如:1111,0001,0101 两数用空格或回车隔开):");
  19.         scanf("%s%s",Multiplicandc,Multiplierc);
  20.         //数据输入

  21.         CTB(Multiplicandc,Multiplicandb,3);
  22.         CTB(Multiplierc,Multiplierb,3);
  23.         CTB(Multiplicandc,Product,3);
  24.         //类型转换
  25.        

  26.         for(n=0;n<=3;n++)
  27.         {
  28.                 Displacement(Product,7,c);
  29.                 ALU(Multiplicandb,Product,p,g,c);
  30.                 for(i=3;i>=0;i--)
  31.                         {
  32.                                 FA(p[i],g[i],Depositb);
  33.                                 Product[i]=        Depositb[0];
  34.                         }
  35.         }//算法
  36.        
  37.         BTC(Product,Depositc,8);
  38.         printf("计算结果:%s",Depositc);
  39.         return;

  40. }


  41. void ALU(bool x[],bool y[],bool p[],bool g[],bool c[])//4位全加部件ALU
  42. {       
  43.         for(int t=0;t<=3;t++)
  44.                 {
  45.                         p[t]=x[t]||y[t];
  46.                         g[t]=x[t]&&y[t];
  47.                 }
  48.         for(int i=0;i<=3;i++)
  49.         {
  50.                 int j=1;
  51.                 c[j]=(p[i]&&c[j-1])||g[i];
  52.                 j++;
  53.         }
  54.         return;
  55. }

  56. //1位逻辑运算,c[]作为寄存器,其中c[0]储存计算结果,c[1]用作存储上次计算结果的进位,c[]指向主函数的Depositb
  57. void FA(bool a,bool b,bool c[])
  58. {
  59.         if((a||b)&&(a||c[1])&&(b||c[1])){c[1]=true;}
  60.         c[0]=a^b^c[1];
  61.         c[1]=false;
  62.         return;
  63. }
  64. void CTB(char a[],bool b[],int i)//char转bool
  65. {
  66.         for(;i>=0;i--)
  67.         {
  68.                 if(a[i]=='0'){b[i]=false;}
  69.                 else{b[i]=true;}
  70.         }
  71.         return;
  72. }
  73. void Displacement(bool a[],int i,bool b[])//数组移位,右移一位,左边用j值填充,右边一位抛弃
  74. {
  75.         for(;i>=0;i--)
  76.         {
  77.                 if(i=0){a[0]=b[5];break;}
  78.                 a[i]=a[i-1];
  79.         }
  80.         b[5]=0;
  81.         return;
  82. }
  83. void BTC(bool a[],char b[],int i)//bool 转char
  84. {
  85.         for(;i>=0;i--)
  86.         {
  87.                 if(i=8){b[8]='\0';continue;}
  88.                 if(a[i]=false){b[i]='0';}
  89.                 else{b[i]='1';}
  90.         }
  91.         return;
  92. }
复制代码

这是我优化后的代码  但是还是输出不了结果  一直在运行

点评

1 0 1 0 * 1 1 0 1 ————————— —— 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 ———————————— 1 0 0 0 0 0 1 0  详情 回复 发表于 2014-3-13 03:32
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2014-3-13 00:28:27 | 显示全部楼层
Nisy 发表于 2014-3-12 21:35
CPU乘法算法  // CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂 ...

楼上是我优化后的代码和思路 但是依然无法输出结果   求支援
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2014-3-13 00:34:55 | 显示全部楼层
Nisy 发表于 2014-3-12 21:35
CPU乘法算法  // CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂 ...

我是初学者 难免会饭诸多错误  请多多指教   帮我找找错误  3QVRMC
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2014-3-13 12:59:39 | 显示全部楼层
Nisy 发表于 2014-3-13 03:32
1  0  1  0
     *      1  1  0  1
————————— ——

话说不是我非要这么写   我知道CPU的乘法计算方式--阵列乘法运算  但是作业要求的是这种算法 。。。。。。。。

点评

我写的那个代码逻辑不是很清楚么 就是按你的表达式来搞的啊 什么算法无所谓 都是在用C去描述你的逻辑 而貌似你驾驭C去表述自己的逻辑有待提高  详情 回复 发表于 2014-3-13 14:05
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2014-3-13 13:02:11 | 显示全部楼层
Nisy 发表于 2014-3-13 03:32
1  0  1  0
     *      1  1  0  1
————————— ——

另外  我是初学者  你要理解初学者的苦衷啊
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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