本帖最后由 xiaojuan 于 2014-9-24 22:38 編輯
////////////////////////////////////////////////////////
//功能:實現兩個64位以下數的相乘
//作者:豆腐干
//時間:2014年9月22日 14:10:47
//如果想運算更大的數據只需要更改數組大小便可
////////////////////////////////////////////////////////
#include<stdio.h>
#include<string.h>
int main(void)
{
char buf1[64] ="12345678912345678912345678912345678912345678912345678912345678";
char buf2[64] ="98765432198765432198765432198765432198765432198765432198765432";
char dest[64 * 64 * 4]; //存放過程數值
char result[128 * 2] = {0}; //存放結果
char *temp1 = buf1;
char *temp2 = buf2;
char *temp3 = dest;
char *temp4 = dest;
char *temp5 = result;
int len1, len2, temp, flag = 0, num;
len1 = strlen(buf1);
len2 = strlen(buf2);
printf("%s\n%s\n", buf1, buf2);
int i, j;
for(i = 1; i < len2 + 1; i++)
{
for(j = 1; j < i; j++)
{
*temp3 = '0';
temp3++;
}
for(j = 1; j < len1 + 1; j++)
{
temp = (*(temp1 + len1 - j) - '0') * (*(temp2 + len2 - i) -'0');
num = temp % 10 + flag;
flag = temp / 10;
if(num / 10)
{
flag += num / 10;
num = num % 10;
}
*temp3 = num + '0';
temp3++;
}
if(flag)
{
*temp3 = flag + '0';
temp3++;
flag = 0;
}
else
{
*temp3 = '0';
temp3++;
}
for(j = 1; j < len2 - i + 1; j++)
{
*temp3 = '0';
temp3++;
}
}
*temp3 = '\0';
printf("%s\n", dest);
for(i = 0; i < len1 + len2; i++)
{
temp = 0;
for(j = 0; j < len2; j++)
{
temp3 = temp4;
temp += (*(temp3 + (len1 + len2) * j) - '0');
}
temp += flag;
flag = 0;
if(temp / 10)
{
flag = temp / 10;
temp = temp % 10;
}
temp4++;
*temp5 = temp + '0';
temp5++;
*temp5 = '\0';
}
for(i = 0; i <= len1 + len2; i++)
{
printf("%c", *(temp5--));
}
putchar('\n');
return 0;
}
//運行環境:Linux
//注:1.輸入問題 我用scanf函數試了下有問題
// 2.輸出如果最高位是0,沒做處理
|