高位乘法运算
#include<stdio.h>
void ok(int *t,int n,int j)
{
int temp;
for(int i=399;i>400-n*j;i--)
{
temp=t[i]/10;
t[i]%=10;
t[i-1]+=temp;
}
}
void print(int *t,int i,int j)
{
for(int n=400-i*j;n<400;n++)
printf("%d",t[n]);
printf("\n");
}
int main()
{
static int ch[200],sh[200];
static int zh[400];
int temp,temp1,n=399,n1=399,i=0,j=0;
int d=0;
printf("数组ch[200]:");
while(i<200)
{
scanf("%d",&d);
if(d>=10||d<0)
break;
ch[i++]=d;
}
printf("数组sh[200]:");
while(j<200)
{
scanf("%d",&d);
if(d>=10&&d<0)
sh[j++]=d;
}
for(int k=i-1;k>=0;k--)//重心
{
for(int v=j-1;v>=0;v--)
{
zh[n--]=ch[k]*sh[v];
}
n1-=1;
n=n1;
}
ok(zh,i,j);
print(zh,i,j);
return 0;
}
这是道两个两百位以内整数相乘的算法,不知哪儿错了!帮忙看看吧!
[解决办法]
#include <stdio.h> #include <string.h> #include <stdlib.h>#define MAX_LEN 200 unsigned an1[MAX_LEN+10]; unsigned an2[MAX_LEN+10]; unsigned aResult[MAX_LEN * 2 + 10]; char szLine1[MAX_LEN+10]; char szLine2[MAX_LEN+10]; int main() { gets( szLine1); //gets 函数读取一行 gets( szLine2); int i, j; int nLen1 = strlen( szLine1); memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); memset( aResult, 0, sizeof(aResult)); j = 0; for( i = nLen1 - 1;i >= 0 ; i --) an1[j++] = szLine1[i] - '0'; int nLen2 = strlen(szLine2); j = 0; for( i = nLen2 - 1;i >= 0 ; i --) an2[j++] = szLine2[i] - '0'; for( i = 0;i < nLen2; i ++ ) { //每一轮都用an1 的一位,去和an2 各位相乘 //从an1 的个位开始 for( j = 0; j < nLen1; j ++ ) //用选定的an1 的那一位,去乘an2 的各位 aResult[i+j] += an2[i]*an1[j]; //两数第i, j 位相乘,累加到结果的第i+j 位 } //下面的循环统一处理进位问题 for( i = 0; i < MAX_LEN * 2; i ++ ) { if( aResult[i] >= 10 ) { aResult[i+1] += aResult[i] / 10; aResult[i] %= 10; } } //下面输出结果 bool bStartOutput = false; for( i = MAX_LEN * 2; i >= 0; i -- ) if( bStartOutput) printf("%d", aResult[i]); else if( aResult[i] ) { printf("%d", aResult[i]); bStartOutput = true; } if(! bStartOutput ) printf("0"); system("pause"); return 0; }