| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 465 人关注过本帖
标题:以下这张图表示出现了什么错误
只看楼主 加入收藏
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
结帖率:92.86%
收藏
已结贴  问题点数:40 回复次数:10 
以下这张图表示出现了什么错误
我在写超大数乘法,努力了很久,勉强写出来了,满怀期待地运行,结果出来了这个
[attach]67350[/attach]
我的代码是:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int i,j;
    int a[1000]={0},b[1000]={0},c[1000][1000]={0},d[1000]={0};
    char x[1000],y[1000];
    gets(x);
    gets(y);
    for(i=0;i<strlen(x);i++)
        a[i]=x[i]-48;
    for(i=0;i<strlen(y);i++)
         b[i]=y[i]-48;
    for(i=strlen(x)-1;i>=0;i--)
        for(j=strlen(x)-1;j>=0;j--)
        {
            c[i][j]=a[i]*b[j]+c[i][j];
            c[i][j-1]=c[i][j]/10+c[i][j-1];
            c[i][j]=c[i][j]%10;
        }
    for(i=strlen(x)-1;i>=0;i--)
    {
        for(j=strlen(x)-1;j>=0;j--)
            d[i]=d[i]+c[i][j];
        d[i-1]=d[i]/10+d[i-1];
        d[i]=d[i]%10;
    }
    for(i=0;i<strlen(x);i++)
        printf("%d",d[i]);
    return 0;
}
求大神帮助,分数多多。

[ 本帖最后由 空白先生 于 2012-12-20 16:48 编辑 ]
搜索更多相关主题的帖子: include 
2012-12-20 16:28
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
猫哥,分数等着你哦

printf("My goal is to be  good at computer")
2012-12-20 16:28
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:20 
问题在这,当i=0时,d[i-1]越界了
for(i=strlen(x)-1;i>=0;i--)
    {
        for(j=strlen(x)-1;j>=0;j--)
            d[i]=d[i]+c[i][j];
        d[i-1]=d[i]/10+d[i-1];
        d[i]=d[i]%10;
    }

小小战士,战士中的战斗机!
2012-12-20 16:31
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
改了以后还是这个错误

printf("My goal is to be  good at computer")
2012-12-20 16:41
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
我在d[i-1]=d[i]/10+d[i-1]之前加了if(i>1);

printf("My goal is to be  good at computer")
2012-12-20 16:42
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
for(i=strlen(x)-1;i>=0;i--)
        for(j=strlen(x)-1;j>=0;j--)
        {
            c[i][j]=a[i]*b[j]+c[i][j];
            c[i][j-1]=c[i][j]/10+c[i][j-1];   这句也错了,和上面一=样原因,你好好把你代码检查啊
            c[i][j]=c[i][j]%10;
        }

小小战士,战士中的战斗机!
2012-12-20 16:52
空白先生
Rank: 2
等 级:论坛游民
帖 子:115
专家分:95
注 册:2012-12-9
收藏
得分:0 
回复 6楼 小小战士
也一起改了呀

printf("My goal is to be  good at computer")
2012-12-20 16:53
h1023417614
Rank: 4
等 级:禁止访问
帖 子:211
专家分:237
注 册:2012-11-30
收藏
得分:20 
回复 7楼 空白先生
c[1000][1000]太大了啊
2012-12-20 16:56
冰冻零点
Rank: 3Rank: 3
来 自:西安电子科技大学
等 级:论坛游侠
帖 子:81
专家分:136
注 册:2012-9-18
收藏
得分:0 
把数组都声明为全局变量试试

好好学习,天天向上
2012-12-20 17:24
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
看了你的代码,发现你想法很好,就是不会处理进位和最终的加,下面这个例子看看吧,思考思考,也是实现两个超大数相乘的,编译器要支持动态数组
//程序实现两个任意长度数字相成
#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,nn,mm,i,j,t,k1,k2,n_1,n_2,temp,count,flag;
    char str1[100];
    char str2[100];
loop_1:    printf("请输入第一个100位以内的数字:");
    gets(str1);
    int N=strlen(str1);
    for(i=0,j=0,n=0,nn=0;i<N;i++)
    {
        if(str1[i]<'0'||str1[i]>'9')
        {
            printf("输入错误!请输入一串数字!\n");
            goto loop_1;
        }
        else
        if(str1[i]=='0')
        n++;
        else
        for(;j<1;j++)
        nn=n;
    }
loop_2:    printf("请输入第二个100位以内的数字:");
    gets(str2);
    int M=strlen(str2);
    for(i=0,j=0,m=0,mm=0;j<M;j++)
    {
        if(str2[j]<'0'||str2[j]>'9')
        {
            printf("输入错误!请输入一串数字!\n");
            goto loop_2;
        }
        else
        if(str2[j]=='0')
        m++;
        else
        for(;i<1;i++)
        mm=m;
    }
    if(nn==0&&str1[0]=='0')
    N=1;
    if(mm==0&&str2[0]=='0')
    M=1;
    if(N==1&&M==1)//一位数乘一位数单独列出
    {
        if(str1[0]<str2[0])
        temp=str1[0],str1[0]=str2[0],str2[0]=temp;
        printf("两数相乘过程如下:\n");
        printf("  %c\n",str1[0]);
        printf("* %c\n",str2[0]);
        printf("---\n");
        n_2=(str1[0]-48)*(str2[0]-48);
        if(n_2<10)
        printf("  %d\n",n_2);
        else
        printf(" %d\n",n_2);
        return 0;
    }
    N=N-nn;
    M=M-mm;
    char num_1[N+M];//第一个数(数组后半段)
    char num_2[N+M];//第二个数(数组后半段)
    char num_3[M][N+M];//保存中间数
    int num_4[N+M];//保存结果
    memset(num_1,' ',sizeof(num_1));//初始化各数组
    memset(num_2,' ',sizeof(num_2));
    memset(num_3,' ',sizeof(num_3));
    memset(num_4,0,sizeof(num_4));
    if(N<M)//第一串比第二串短
    {
        temp=N;//交换后,N为长数的位数,M为短数的位数
        N=M;
        M=temp;
        for(i=M;i<N+M;i++)//给第一个数赋值较长串
        num_1[i]=str2[i-M+mm];
        for(i=N;i<N+M;i++)//给第二个数赋值较短串
        num_2[i]=str1[i-N+nn];
    }
    else//第一串比第二串长
    {
        for(i=M;i<N+M;i++)//给第一个数赋值较长串
        num_1[i]=str1[i-M+nn];
        for(i=N;i<N+M;i++)//给第二个数赋值较短串
        num_2[i]=str2[i-N+mm];
    }
    num_2[N-2]='*';//确定'*'的位置
    printf("两数相乘过程如下:\n");
    for(i=0;i<N+M;i++)//打印第一个数
    printf("%c",num_1[i]);
    printf("\n");
    for(i=0;i<N+M;i++)//打印'*'和第二个数
    printf("%c",num_2[i]);
    printf("\n");
    for(i=0;i<N+M;i++)//打印下划线
    printf("-");
    printf("\n");
    num_1[M-1]='0';//用于最后一位进位计算
    for(i=0;i<M;i++)//开始相乘
    for(j=0,flag=0;j<N+1;j++)//第二个数的每位(由低位向高位)与第一个数相乘
    {
        n_1=(num_2[N+M-1-i]-48)*(num_1[N+M-1-j]-48)+flag;//每位分别相乘并进位
        if(j==N&&flag==0)
        num_3[i][N+M-1-i-j]=' ';//防止首位打印0
        else
        num_3[i][N+M-1-i-j]=n_1%10+48;//向二维数组中保存计算过程
        flag=n_1/10;//获取进位标志
    }
    for(i=0,flag=0;i<N+M;i++)
    {
        for(j=0;j<M;j++)
        if(num_3[j][N+M-1-i]!=' ')
        num_4[N+M-1-i]+=num_3[j][N+M-1-i]-48;//列元素相加
        num_4[N+M-1-i]+=flag;
        flag=num_4[N+M-1-i]/10;//获取进位标志
        if(i==N+M-1&&num_4[N+M-1-i]==0)
        num_4[N+M-1-i]=' ';//防止首位打印0
        else
        num_4[N+M-1-i]%=10;//保存结果
    }
    for(i=N,k2=0;i<N+M;i++)//计算第二个数非0的个数
    if(num_2[i]!='0')
    k2++;
    if(k2!=1)//只有一行则不打印,超过一行才打印
    for(i=0,flag=0;i<M;i++)//打印计算过程
    {
        for(j=0;j<N+M;j++)
        if(num_3[i][j]!='0'&&num_3[i][j]!=' ')//一旦发现此行有数字则跳出循环
        {
            flag=1;
            break;
        }
        if(flag==1)
        {
            for(j=0;j<N+M;j++)//打印有数字的行
            printf("%c",num_3[i][j]);
            printf("\n");
            flag=0;//标志还原
        }
    }
    if(k2!=1&&k2!=0)//超过两行才打印下划线
    {
        for(i=0;i<N+M;i++)
        printf("-");
        printf("\n");
    }
    if(k2!=0)//有非0的数字则打印结果
    for(i=0;i<N+M;i++)//打印结果
    {
        if(i==0&&num_4[i]==' ')
        printf(" ");//防止首位打印0
        else
        printf("%d",num_4[i]);
    }
    else//全是0则打印一个0
    {
        for(i=0;i<N+M-1;i++)
        printf(" ");
        printf("0");
    }
    printf("\n\n");
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

小小战士,战士中的战斗机!
2012-12-20 17:41
快速回复:以下这张图表示出现了什么错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018227 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved