| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 991 人关注过本帖
标题:大哥大姐,帮我看一下吧,谢谢!
只看楼主 加入收藏
逸浪1
Rank: 2
来 自:重庆
等 级:论坛游民
帖 子:19
专家分:24
注 册:2013-11-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:17 
大哥大姐,帮我看一下吧,谢谢!
实验题目:字符串应用(大整数加法)
 字符串应用实验内容:输入两个大整数(大于100位),求它们之和。

实验类型:综合性

实验目的:

  (1)掌握字符串的表示方法;

(2)掌握字符串常用处理方法;

(3)掌握字符串标准库函数的使用方法;

实验指导(算法框架):

主函数框架:
1. 定义合适的字符数组n1,n2,result
 2. 输入两个表示大整数的字符串n1,n2
 3. 获取n1,n2的长度len1,len2
 4. If( len1 <= len2 )  //加数长度大于被加数长度
           被加数向右移空出高位补’0’(函数RightMoving实现)
    Else
            加数向右移空出高位补’0’ (函数RightMoving实现)
5. 求n1,n2的和放入result(函数LargerIntegerAdd实现)
6. 输出字符串result的值(即求和的结果)

函数void RightMoving(char *s,int n)框架
1. 将s中的所有字符向右移动n个字符位置(空出前n个位置)
2. 将s的前n个位置填充字符’0’

函数int LargerIntegerAdd(char *result,char *n1,char *n2)框架
1. 求出result数据的最后位置(比n1或n2大1)
2. 置result的结尾符号’\0’
3. 从result的最低位开始直到次高位为止
         计算当前位置的数字
         计算当前位置向高位的进位值
4. 置result的最高位数字
5. 判断最高位数字是’0’还是’1’并将判断结果返回(用于确定输出时是否输出表示最高位数字的字符)

#include<stdio.h>
#include<string.h>
void RightMoving(int len2,int len1,int n,char*n1);
void main()
{
    char n1[500],n2[500];
    int len1,len2,x,y;
    printf("输入两个大整数\n");
    gets(n1);
    gets(n2);
    len1=strlen(n1);
    len2=strlen(n2);
    if(len1<=len2)
    {
        x=len2-len1;
        RightMoving(len2,len1,x,n1);
        puts(n1);
    }
    else
    {
        y=len1-len2;
        RightMoving(len1,len2,y,n2);
        puts(n2);
    }
    int w,q,nu1,nu2,sum,b,a;
    char result[800];
    w=strlen(n1);
    q=w;
    while(w>=1)
    {
        nu1=n1[w-1]-'0';
        nu2=n2[w-1]-'0';
         sum=nu1+nu2+b;
        if(sum<10)
        {
            result[w]=sum+'0';
            b=0;
        }
        else
        {
            a=sum%10;
            result[w]=a+'0';
            b=sum/10;
        }
        w--;
    }
    result[w+1]='\0';

    puts(result);
}
void RightMoving(int len2, int len1, int n,char*n1)
{
    n=len2-len1;
    while(len1>=1)
    {
        n1[len2-1]=n1[len1-1];
        len2--;
        len1--;
    }
    while(n>=0)
    {
        n1[n]='0';
        n--;
    }
}
搜索更多相关主题的帖子: 实验目的 result 字符串 大哥 
2013-11-22 21:03
a151141
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:197
专家分:680
注 册:2012-10-19
收藏
得分:10 
#include<stdio.h>
#include<string.h>
void RightMoving(int len2,int len1,int n,char *n1);
void main()
{
    char n1[500],n2[500];
    int len1,len2,x,y;
    printf("输入两个大整数\n");

    gets(n1);

    gets(n2);
    len1=strlen(n1);
    len2=strlen(n2);

    if(len1<=len2)
    {
        x=len2-len1;
        RightMoving(len2,len1,x,n1);
        puts(n1);
    }
    else
    {
        y=len1-len2;
        RightMoving(len1,len2,y,n2);
        puts(n2);
    }
    int w,q,nu1,nu2,sum,b,a;
    b=0;
    char result[800];
    w=strlen(n1);
    q=w;
    while(w>=1)
    {
        nu1=n1[w-1]-'0';
        nu2=n2[w-1]-'0';
         sum=nu1+nu2+b;
        if(sum<10)
        {
            result[w-1]=sum+'0';
            b=0;
        }
        else
        {
            a=sum%10;
            result[w-2]=a+'0';
            b=sum/10;
        }
        w--;
    }
    result[q]='\0';

    puts(result);
}
void RightMoving(int len2, int len1, int n,char *n1)
{

    int m=len2;
    while(len1>=1)
    {
        n1[len2-1]=n1[len1-1];
        len2--;
        len1--;
    }
    while(n>0)
    {
        n1[n-1]='0';
        n--;
    }
    n1[m]='\0';
}
不容易啊,你好多地方都有点小问题,以经改正,这里就不意义列举了,你对照的看一下,不懂的可以继续交流

世界上幸福的事就是抓到一只羊,更幸福的事就是抓到两只羊……
2013-11-22 22:46
逸浪1
Rank: 2
来 自:重庆
等 级:论坛游民
帖 子:19
专家分:24
注 册:2013-11-2
收藏
得分:0 
大哥,还是有错误啊!
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-11-23 23:19
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
收藏
得分:0 
result[w-2]=a+'0';这里应该是 result[w-1]=a+'0';
最后存放结果的数组长度怎么和n1、n2长度一样。上面相当于溢出了,感觉存放结果从result[0]开始,再逆过来,输出,应该就没有楼主出现的问题了。

好好学习,天天想上
2013-11-23 23:50
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:0 
你的错误在哪?????哪里没有实现啊?????你不粘上,怎么看啊

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-11-24 10:07
a151141
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:197
专家分:680
注 册:2012-10-19
收藏
得分:0 
sorry。上次忘了考虑进位的事了
这是心调试的,你试试
#include<stdio.h>
#include<string.h>
void RightMoving(int len2,int len1,int n,char *n1);
void main()
{
    char n1[500],n2[500];
    int len1,len2,x,y;
    printf("输入两个大整数\n");

    gets(n1);

    gets(n2);
    len1=strlen(n1);
    len2=strlen(n2);

    if(len1<=len2)
    {
        x=len2-len1;
        RightMoving(len2,len1,x,n1);
        puts(n1);
    }
    else
    {
        y=len1-len2;
        RightMoving(len1,len2,y,n2);
        puts(n2);
    }
    int w,q,nu1,nu2,sum,b,a;
    b=0;
    char result[800]={'0'};
    w=strlen(n1);
    q=w;
    while(w>=1)
    {
        nu1=n1[w-1]-'0';
        nu2=n2[w-1]-'0';
         sum=nu1+nu2+b;
        if(sum<10)
        {
            result[w-1]=sum+'0';
            b=0;
        }
        else
        {
            a=sum%10;
            result[w]=a+'0';
            b=sum/10;
        }
        w--;
    }
    if(b==1)result[0]='1';
    result[q+1]='\0';

    puts(result);
}
void RightMoving(int len2, int len1, int n,char *n1)
{

    int m=len2;
    while(len1>=1)
    {
        n1[len2-1]=n1[len1-1];
        len2--;
        len1--;
    }
    while(n>0)
    {
        n1[n-1]='0';
        n--;
    }
    n1[m]='\0';
}

世界上幸福的事就是抓到一只羊,更幸福的事就是抓到两只羊……
2013-11-25 10:15
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:10 
这个我还没做过, 试了试, 感觉不错,
楼主要是还有其它类似的题目也提供上来,互相学习学习呀....
下面我把我的代码发上来, 主要是按题目要求一步一步来的.(要是所有的题目都这么详细, 那这个世界就和平了).
程序代码:
#include <stdio.h>
#include <string.h>

#define  MAXLEN  1000           // 数组长度

void RightMoving(char *s, int n);
int LargerIntegerAdd(char *result, char *n1, char *n2);

// 主函数
int main()
{
    char n1[MAXLEN];          // 1.定义字符数组
    char n2[MAXLEN];
    char result[MAXLEN+1];
    int len1, len2;
   
    printf("Enter n1 :\n");   // 2. 输入表示大整数的字符串
    scanf("%s", n1);
    printf("Enter n2 :\n");
    scanf("%s", n2);

    len1 = strlen(n1);       // 3. 获取n1,n2的长度len1, len2
    len2 = strlen(n2);

    printf("The sum of %s + %s = ", n1, n2);
       
    if (len1 <= len2)                  // 4. 用RightMoving()函数移动数组
        RightMoving(n1, len2-len1);
    else
        RightMoving(n2, len1-len2);

    if (LargerIntegerAdd(result, n1, n2))  // 5.求和,根据LargerIntegerAdd()函数返回值输出
        printf("%s\n", result);            // 返回值为1, 输出最高位   
    else
        printf("%s\n", result+1);         // 返回值为0, 不输出最高位
    return 0;
}

void RightMoving(char *s, int n)
{
    int len;

    if (n == 0)           // 若两个数长度相等,不移动
        return;
    len = strlen(s);      // 题目函数中不传递数组长度, 所以在这里重新获取
    s[len+n] = '\0';      // 置数组结尾符

    while (--len >= 0)    // 1.将所有字符右移n个字符位置
        s[len+n] = s[len];
    while (--n >= 0)      // 2. 将前n个位置填充字符'0'
        s[n] = '0';
}

int LargerIntegerAdd(char *result, char *n1, char *n2)
{
    int i = 0;           // 表示进位的值.
    int x, y;
    int len;
   
    len = strlen(n1) + 1;        //  1. 求出result数组的最后位置(比n1或n2大1)
                                 //  注.此时, n1的长度是等于n2的 
    result[len] = '\0';          // 2. 置result数组的结尾符号'\0'  
   
    for (len--; len > 0; len--) {    // 3. 计算, 直到次高位为止.
        x = n1[len-1] - '0';
        y = n2[len-1] - '0';
        result[len] = (x+y+i) % 10  + '0';
        i = (x+y+i) / 10;
    }
    result[len] = i + '0';           // 4. 置result的最高位
    return i;                        // 5. 返回最高位.0或1
}
2013-11-25 12:58
飘叶csc
Rank: 2
等 级:论坛游民
帖 子:23
专家分:34
注 册:2013-11-13
收藏
得分:0 
留爪印,标记再看
2013-11-25 21:10
逸浪1
Rank: 2
来 自:重庆
等 级:论坛游民
帖 子:19
专家分:24
注 册:2013-11-2
收藏
得分:0 
谢谢大家啊!
2013-11-27 21:22
逸浪1
Rank: 2
来 自:重庆
等 级:论坛游民
帖 子:19
专家分:24
注 册:2013-11-2
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

大哥,这里不懂
2013-11-27 22:50
快速回复:大哥大姐,帮我看一下吧,谢谢!
数据加载中...
 
   



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

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